Фрагмент запуска активности занимает больше времени, чем ожидалось - PullRequest
0 голосов
/ 05 декабря 2018

Я начинающий-промежуточный разработчик Android.Я начал работать с фрагментами в этом приложении.Структура приложения выглядит следующим образом:

  1. Основное действие, в которое встроены некоторые важные ссылки с помощью кнопок
  2. При нажатии кнопки в основном упражнении некоторые задачи БД завершены (с библиотекой помещений, поэтому все задачи выполняются).используют AsyncTask), и новое действие открывается со ссылкой в ​​намерении extra
  3. При получении ссылки новое действие 2 добавляет фрагмент (сам по себе), а также выполняет некоторые задачи БД в фоновом режиме, а затем открывает ссылку ввеб-просмотр фрагмента.

Проблема в том, что из 1-2 это занимает всего 0,1-0,15 секунды, а при запуске задания 3 - 0,3-0,45 секунды, поэтому при нажатии на основной вид деятельности,пользователь получает ссылку, открытую во фрагменте (которая имеет веб-просмотр) примерно за 0,6 секунды, что создает ощущение, что приложение зависает.

Вот несколько кодов: Упражнение-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 есть только веб-просмотр, где веб-просмотр загружает множество веб-настроек.Но дело доходит до тех пор, пока фрагмент не займет время, например, когда пользователь щелкает по основному действию, и примерно через 0,6 секунды открывается фрагмент, в то время как действие, у которого есть фрагмент, открывается всего за 0,1 секунды, поэтому это время (возможно) связано с прикреплением фрагмента или чего-то еще.?

Может кто-нибудь объяснить, где я совершаю ошибку?

У меня были некоторые сомнения по этому поводу:

  1. Является ли проблема веб-просмотра (фрагмент),у которого есть набор веб-настроек?
  2. Требуется ли больше времени для присоединения фрагмента к операции-2?
  3. Является ли пользовательский интерфейс частью операции-2 отниманием времени (например, настройка панели инструментов с 4 кнопками) и послеэтот фрагмент прикрепляется к нему, что приводит к большему потреблению времени?
  4. или это нормальная ситуация?

Может кто-нибудь, пожалуйста, объясните мне, как это сделать, чтобы<0,2 секунды для целых задач?Заранее спасибо. </p>

...