我正在使用android下载管理器下载文件。文件是多个,我在listview中显示它们的进度。我的代码工作正常但是当我的下载量超过4或5时,listview变得非常慢,事实上整个应用程序变慢了。在一瞬间它被卡住了,我要强行关闭,因为手机也被绞死了。 这是我更新listview的代码。
private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> {
boolean isRunning = true;
boolean progressBusy = false;
public void stop() {
isRunning = false;
}
@Override
protected Void doInBackground(Void... params) {
while (isRunning) {
if(progressBusy==true){
}
else{
progressBusy = true;
publishProgress();
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... params) {
super.onProgressUpdate();
try {
progressBusy = false;
if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
int start = Lv_DownloadItems.getFirstVisiblePosition();
for (int i = start, j = Lv_DownloadItems
.getLastVisiblePosition(); i <= j; i++) {
View view = Lv_DownloadItems.getChildAt(i - start);
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(Long.parseLong(progress_ids
.get(i)));
final Cursor cursor = downloadManager.query(q);
cursor.moveToFirst();
long bytes_downloaded = cursor
.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor
.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
int len1 = (int)(bytes_downloaded * 100 / bytes_total);
int columnIndex = cursor
.getColumnIndex(DownloadManager.COLUMN_STATUS);
ProgressBar progress = (ProgressBar) view
.findViewById(R.id.progressBar1);
progress.setProgress(len1);
TextView txtStatus = (TextView) view
.findViewById(R.id.percentage);
// txtStatus.setPadding(10, 0, 0, 0);
txtStatus.setText(String.valueOf(len1) + "%");
cursor.close();
}
}
} catch (Exception ec) {
ec.printStackTrace();
}
}
}
我在onResume上调用了这个异步任务
UpdaterAsyncTask mUpdater = new UpdaterAsyncTask();
mUpdater.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
(Void) null);
我完全陷入困境,不知道我哪里错了,请帮助我。任何帮助将非常感激。谢谢你:))
答案 0 :(得分:0)
Thread.sleep(16);
。 16毫秒?那很短。 onProgressUpdate将花费更多的时间。但更重要的是:如果你经常调用publishProgress(),它们都会堆叠起来,因为onProgressUpdate只有在OS有时间在UI线程上执行时才会被调用。通过一些调整,您可以阻止早期调用publishProgress()。添加到asynctask a volatile boolean progressBusy = false;
在调用publishProgress()之前将其设置为true。在onProgressUpdate中再次将其设置为false。在doInBackground中,如果progressBusy为true,则不调用publishProgress()。
答案 1 :(得分:0)
从我为您提供的小代码中可以看出,
首先,对于大多数人来说,你不是在调用你的stop()方法,所以我假设你被锁定在一个无限循环中。
public void stop() {
isRunning = false;
}
在Google's Android Developer Documentation site上,他们有一个关于如何正确有效地使用AsyncTask类的优秀示例。
希望它有所帮助。