首页 > 解决方案 > 活动启动中的片段花费的时间比预期的要长

问题描述

我是一名初级到中级的安卓开发者。我开始在我的这个应用程序中使用片段。该应用程序的结构是:

  1. 一些重要链接嵌入按钮的主要活动
  2. 在主要活动中单击按钮时,一些数据库任务已完成(使用 Room Library,因此所有任务都使用 AsyncTask),并且新活动打开并带有额外意图的链接
  3. 获取链接后,新的 activity-2 添加了一个片段(本身)并在后台执行一些数据库任务,然后在片段的 webview 中打开链接。

问题是,从 1-2 开始,在启动任务 3 时只需要 0.1-0.15 秒,从主要活动单击需要 0.3-0.45 秒,用户正在片段中打开链接(具有 webview)在大约 0.6 秒内,这让人感觉应用程序正在冻结。

以下是一些代码: Activity-2:

@Override
protected void onCreate(Bundle savedInstanceState) {
    prefSingleton = PrefSingleton.getInstance();
    if (prefSingleton.getStorage().getBoolean(Constants.STORAGE_ENABLE_NIGHTMODE,false)){
        setTheme(R.style.DarkTheme);
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_website_view);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayShowTitleEnabled(false);

    closeWebview = toolbar.findViewById(R.id.closeWebview);
    downArrow = toolbar.findViewById(R.id.downArrow);
    allTabs = toolbar.findViewById(R.id.allTabs);
    searchIcon = toolbar.findViewById(R.id.search);
    clearEditText = toolbar.findViewById(R.id.clearEditText);
    selectedSEImage = toolbar.findViewById(R.id.selectedSEImage);
    searchEditText = toolbar.findViewById(R.id.searchEditText);
    searchEngineFrame = toolbar.findViewById(R.id.searchEngine);
    searchBarLayout = toolbar.findViewById(R.id.searchBarLayout);
    toolbarTitle = toolbar.findViewById(R.id.toolBarTitle);
    navFrame = findViewById(R.id.navFrame);
    navRecView = findViewById(R.id.navRecView);

    if (prefSingleton.getStorage().getBoolean(Constants.STORAGE_ENABLE_NIGHTMODE,false)){
        navFrame.setBackgroundColor(getResources().getColor(R.color.night_mode_toolbar));
    }

    //Activity toolbar views
    closeWebview.setOnClickListener(this);
    closeWebview.setOnLongClickListener(this);
    downArrow.setOnClickListener(this);
    allTabs.setOnClickListener(this);
    searchIcon.setOnClickListener(this);
    clearEditText.setOnClickListener(this);
    searchEngineFrame.setOnClickListener(this);
    searchEditText.setOnClickListener(this);
    searchEditText.setOnKeyListener(this);

    //Intent from main activity
    Intent i = getIntent();
    String urlType = i.getStringExtra(String.valueOf(EnumVal.SiteInfoToSend.TYPE));
    final String url = i.getStringExtra(String.valueOf(EnumVal.SiteInfoToSend.URL));
    String title = i.getStringExtra(String.valueOf(EnumVal.SiteInfoToSend.TITLE));
    String searchedText = i.getStringExtra(String.valueOf(EnumVal.SiteInfoToSend.SEARCHED_TEXT));

    fragCounter = 0;
    fragTags = new ArrayList<>();

    //Fragment opening
    if (savedInstanceState == null){
        openFragment(url, EnumVal.FragStatus.NEW, null);
    }

    //AdMob Ads
    if (!BuildConfig.PAID_VERSION){
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId(getResources().getString(R.string.interstitial_webview));
        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdFailedToLoad(int errorCode) {
                if(ConsentInformation.getInstance(WebsiteView.this).getConsentStatus() ==
                        ConsentStatus.NON_PERSONALIZED){
                    Bundle extras = new Bundle();
                    extras.putString("npa", "1");
                    mInterstitialAd.loadAd(new AdRequest.Builder()
                            .addNetworkExtrasBundle(AdMobAdapter.class,extras).build());
                } else {
                    mInterstitialAd.loadAd(new AdRequest.Builder().build());
                }
            }
        });
        if(ConsentInformation.getInstance(WebsiteView.this).getConsentStatus() == ConsentStatus.NON_PERSONALIZED){
            Bundle extras = new Bundle();
            extras.putString("npa", "1");
            mInterstitialAd.loadAd(new AdRequest.Builder()
                    .addNetworkExtrasBundle(AdMobAdapter.class,extras).build());
        } else {
            mInterstitialAd.loadAd(new AdRequest.Builder().build());
        }
    }

    //Toolbar search edit text will be enabled in below case
    if (urlType.equals(EnumVal.Type.SEARCHED_TEXT.toString())){
        searchBarLayout.setVisibility(View.VISIBLE);
        searchIcon.setImageResource(R.drawable.close_icon);
        searchEditText.setText(searchedText);
        searchEditText.clearFocus();
        searchEditText.setCursorVisible(false);
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        if (searchEditText.hasFocus())
            searchEditText.setCursorVisible(true);

    }


    searchEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            clearEditText.setVisibility(View.VISIBLE);
        }
    });

    //Navigation view in toolbar
    navRecView.setLayoutManager(new LinearLayoutManager(this));

    mViewModel = ViewModelProviders.of(this).get(DbViewModel.class);
    mViewModel.getSitesWithClicksByIsShown().observe(this, new Observer<List<SitesWithClicks>>() {
        @Override
        public void onChanged(@Nullable List<SitesWithClicks> sitesWithClicks) {
            if (sitesWithClicks!= null && sitesWithClicks.size()>0){
                int reArrSite = prefSingleton.getStorage().getInt(Constants.STORAGE_REARRANGESITE_NAV,
                        Constants.SORTING_PRIORITY);

                sitesWithClicks = Utility.sortSitesData(reArrSite, sitesWithClicks);
                navAdapter = new ListRecViewAdapter(EnumVal.DialogType.NAVBAR_ITEMS,
                        sitesWithClicks, WebsiteView.this);
                navRecView.setAdapter(navAdapter);
            }
        }
    });

}

开片法:

public void openFragment(String url, EnumVal.FragStatus fragStatus, String toOpenTag){
    if(navFrame.getVisibility() == View.VISIBLE)
        downArrow.performClick();

    if(fragStatus == EnumVal.FragStatus.NEW){
        String fragTag = getNextFragTag();

        WebsiteViewFragment fragment = WebsiteViewFragment.newInstance(url, fragTag);
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

        if(fragCounter == 1){
            fragmentTransaction.replace(R.id.fragment, fragment, fragTag);
            currentFrag = fragTag;
        } else {
            if(getSupportFragmentManager().findFragmentByTag(currentFrag) != null){
                fragmentTransaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                fragmentTransaction.hide(getSupportFragmentManager().findFragmentByTag(currentFrag));
            }

            fragmentTransaction.add(R.id.fragment, fragment, fragTag);
            currentFrag = fragTag;
        }
        fragmentTransaction.commit();
        fragTags.add(new TabDetail(fragTag,"Tab - 1",null));

    } else if (fragStatus == EnumVal.FragStatus.OLD){
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

        if(getSupportFragmentManager().findFragmentByTag(currentFrag) != null){
            fragmentTransaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
            fragmentTransaction.hide(getSupportFragmentManager().findFragmentByTag(currentFrag));
        }

        fragmentTransaction.show(getSupportFragmentManager().findFragmentByTag(toOpenTag));
        fragmentTransaction.commit();
        currentFrag = toOpenTag;
    }
}

Fragment 中只有 Webview,其中 webview 正在加载大量的 websettings。但是事情一直到片段需要时间,就像用户从主要活动中点击一样,大约 0.6 秒后,片段正在打开,而有片段的活动只需要 0.1 秒即可打开,所以这个时间(可能)与附加片段或其他东西有关?

谁能解释一下,我在哪里犯错了?

我对此有一些疑问:

  1. 问题是 webview(在片段中),它有一堆 websettings 吗?
  2. 将片段附加到活动 2 是否需要更多时间?
  3. 活动 2 的 UI 部分是否需要时间(例如具有 4 个按钮的工具栏设置),并且在该片段附加到它之后,这会导致更多时间消耗?
  4. 还是正常情况?

有人可以解释一下使整个任务<0.2秒的方法吗?提前致谢。

标签: javaandroidandroid-fragmentsandroid-fragmentactivity

解决方案


推荐阅读