我正在做一种文件管理器,我想从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来获取所有文件 任何帮助或建议将不胜感激