Как исправить серьезные проблемы с задержкой в ​​Android - PullRequest
0 голосов
/ 20 апреля 2020

Я пытался заменить тяжелый XML файл каким-то кодом, используя ArrayAdapter, который я сделал. Макет такой, как я ожидал. Однако время загрузки Fragment слишком велико (не менее 10 секунд). Я продолжаю получать сообщения типа I/Choreographer: Skipped 779 frames! The application may be doing too much work on its main thread.

Перед использованием Adapter я пытался использовать AsyncTask или Thread, но сделал его менее медленным.

Согласно профилировщику, 10-секундный интервал находится между первым Fragment паузой и вторым Fragment возобновлением.

Второй фрагмент onViewCreated

    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        final Hashtable<Integer, Integer> dico = new Hashtable<>();
        //region filling Dico
        dico.put(2002, R.array.anMD2002);
        dico.put(2003, R.array.anMD2003);
        dico.put(2004, R.array.anMD2004);
        dico.put(2005, R.array.anMD2005);
        dico.put(2006, R.array.anMD2006);
        dico.put(2007, R.array.anMD2007);
        dico.put(2008, R.array.anMD2008);
        dico.put(2009, R.array.anMD2009);
        dico.put(2010, R.array.anMD2010);
        dico.put(2011, R.array.anMD2011);
        dico.put(2012, R.array.anMD2012);
        dico.put(2013, R.array.anMD2013);
        dico.put(2014, R.array.anMD2014);
        dico.put(2015, R.array.anMD2015);
        dico.put(2016, R.array.anMD2016);
        dico.put(2017, R.array.anMD2017);
        dico.put(2018, R.array.anMD2018);
        dico.put(2019, R.array.anMD2019);
        dico.put(2020, R.array.anMD2020);
        //endregion
        final MySQLiteHelper help = new MySQLiteHelper(getActivity());
        Resources res = getResources();

        final List<String> allExtensionsName = new ArrayList<>();
        //region filling allExtName
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2020)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2019)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2018)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2017)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2016)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2015)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2014)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2013)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2012)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2011)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2010)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2009)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2008)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2007)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2006)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2005)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2004)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2003)));
        allExtensionsName.addAll(Arrays.asList(res.getStringArray(R.array.anMD2002)));
        //endregion

        int[] maxs = getMaxs(allExtensions, help);
        int[] progress = getProgresses(allExtensions, help);

        ListView listView = mView.findViewById(R.id.listView);
        final StatAdapter statAdapter = new StatAdapter((Accueil) getActivity(),prepareAdapter(maxs, progress,
                allExtensionsName, dico), allExtensionsName);
        listView.setAdapter(statAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String[] s = statAdapter.getItem(position);
                if (s==null) return;
                if (!s[2].equals(""))
                    launchParticularStat(s[1],(ProgressBar) view.findViewById(R.id.progress_bar),
                            allExtensions[allExtensionsName.indexOf(s[1])]);
            }
        });
    }

Вот звонок из первого фрагмента:

m.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    StatFrag stats = new StatFrag();
                    accueil.getSupportFragmentManager().beginTransaction().replace(
                            R.id.fragment_container, stats).addToBackStack(null).commit();
                }
            });

Есть ли причина для этого отставать? Спасибо.

1 Ответ

0 голосов
/ 20 апреля 2020

ОК, поэтому мне удалось найти ответ.
Я использовал AsyncTask, и он все еще отставал. Наконец я понял, что могу сделать Log.d, чтобы посмотреть, что заняло время ... Это были части getMaxs и getProgresses. Поэтому я изменил функцию, чтобы получить максимальные значения и значения прогресса по одному в al oop, затем publishProgress, чтобы обновить мои StatAdapter.

...