我正在从SD卡读取文件列表。但是我的应用程序在通过存储循环时冻结了。所以我想在显示所有文件之前显示一个进度条。
public ArrayList<MyFile> getPlayList() {
File home = Environment.getExternalStorageDirectory();
File[] listFiles = home.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file : listFiles) {
if (file.isDirectory()) {
scanDirectory(file);
} else {
addFileToList(file);
}
}
}
return songsList;
}
@OnClick(R.id.btn_browser)
public void onClickBrowser() {
// want to show progress bar here when user click a button
if (fileList == null)
fileList = fileManager.getPlayList();
ListDialog listDialog = new ListDialog(this, fileList,
this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
listDialog.show();
}
最佳答案
您需要使用异步调用getPlayList()
。有多种使用方法,建议使用AsyncTask
,因为获取文件的时间应少于3s。如果更多,那么您需要考虑其他一些背景解决方案。
在您的AsyncTask中,
在onPreExecute()
期间显示进度指示器,
在getPlayList()
中执行doInBackground()
,
最后关闭进度指示器,并在ListDialog
中显示您的onPostExecute()
。
话虽这么说,如果获取播放列表是一次性的事情,并且您可以肯定用户仍然会单击R.id.btn_browser
,则可以预取播放列表。那只是一个设计建议。