尽管使用了AsyncTask,Android主线程/ UI线程仍被阻止(阅读类似帖子但我不满意)

时间:2018-05-11 07:00:06

标签: android android-asynctask background rx-java

我正在做一种文件管理器,我想从external or internal storage(files like APK, images, videos etc)获取所有文件,然后我将这个获取的数据绑定到recycler view,我使用了asyncTask来执行此操作当我在模拟器上运行我的应用程序时运行正常,因为文件非常少,但是当我在真实设备上运行此应用程序时,它会在更新UI后将屏幕挂起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来获取所有文件 任何帮助或建议将不胜感激

0 个答案:

没有答案