Основная тема Android / тема пользовательского интерфейса заблокирована, несмотря на использование AsyncTask (читайте похожие посты, но меня это не устраивает) - PullRequest
0 голосов
/ 11 мая 2018

Я делаю своего рода файловый менеджер, в котором я хочу получить все файлы из external or internal storage(files like APK, images, videos etc), а затем привязываю эти извлеченные данные к recycler view, я использовал asyncTask для выполнения этой операции, это работает нормально работает, когда я запускаю свое приложение на эмуляторе, потому что файлов очень мало, но когда я запускаю это приложение на реальном устройстве, оно зависает на экране на 40-50 секунд после обновления пользовательского интерфейса Вот мой код

protected ArrayList<Integer> getFile(File dir) {
    File listFile[] = dir.listFiles();
    Log.i(">>Files", "getFile: " + Arrays.toString(dir.listFiles()));
    if (listFile != null && listFile.length > 0) {
        for (File aListFile : listFile) {
            if (aListFile.isDirectory()) {
                fileList.add(aListFile);
                getFile(aListFile);
            } else {
                if (aListFile.getName().endsWith(".png")) {
                    Log.i(">>Image", "getFile: " + aListFile.getName());
                    pngImageList.add(aListFile);
                } else if (aListFile.getName().endsWith(".jpg") || aListFile.getName().endsWith(".jpeg")) {
                    jpegImageList.add(aListFile);
                } else if (aListFile.getName().endsWith(".gif")) {
                    gifList.add(aListFile);
                } else if (aListFile.getName().endsWith(".pptx") || aListFile.getName().endsWith(".ppt")) {
                    pptxList.add(aListFile);
                } else if (aListFile.getName().endsWith(".docx") || aListFile.getName().endsWith(".doc")) {
                    docxList.add(aListFile);
                } else if (aListFile.getName().endsWith(".pdf")) {
                    pdfList.add(aListFile);
                } else if (aListFile.getName().endsWith(".txt")) {
                    txtList.add(aListFile);
                } else if (aListFile.getName().endsWith(".apk")) {
                    apkList.add(aListFile);
                }

            }
        }


    }

    return fileSizes;
}

и вызов этой функции в asyncTask's doInBackground, как это

 @Override
    protected Void doInBackground(Void... voids) {
        getFile(file);
        return null;
    }

и после этого я связываю эти извлеченные данные в onPostExecute методе, подобном этому

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        showDialog(false);
        takeAway.add(pngImageList);
        takeAway.add(jpegImageList);
        takeAway.add(gifList);
        takeAway.add(pptxList);
        takeAway.add(docxList);
        takeAway.add(pdfList);
        takeAway.add(txtList);
        takeAway.add(apkList);

        lLayout = new GridLayoutManager(getActivity(), 3);
        insightList.setHasFixedSize(true);
        insightList.setLayoutManager(lLayout);
        insightAdapter = new InsightAdapter(getActivity(), takeAway,COLORFUL_COLORS1);
        insightList.setAdapter(insightAdapter);
        insightAdapter.notifyDataSetChanged();}

Я тоже пытался использовать RX JAVA, но безуспешно, потому что даже тогда мне пришлось использовать asyncTask для получения всех файлов. Будем благодарны за любую помощь или предложение

1 Ответ

0 голосов
/ 11 мая 2018

Я думаю, вы должны обновить адаптер вместо повторного создания в onPostExecute.

...