gpt4 book ai didi

android - 许多 AsyncTasks 产生的 AsyncTask 性能问题。

转载 作者:搜寻专家 更新时间:2023-11-01 09:17:21 25 4
gpt4 key购买 nike

我正在尝试为 ListView 的设备和 Web 图像创建惰性图像加载器。我正在考虑使用什么以及如何使用,一方面我可以使用一个线程来汇集我的请求(始终运行,我可以附加一个 View 和一个适配器,它将为我处理图像加载),缓存我已经加载图像并在加载之前检查图像的可见性,这样我就不会做不需要的工作。

我又想到了使用 AsyncTask,就像论坛中许多人建议的那样。但是有一个缺点。我看到很多人使用 new MyTask().execute(urls); 如果我想按需开始加载和停止加载图像,这会出现问题。如果我对每个图像使用异步任务,那么我需要为每个图像创建新的异步任务,这是很多"new"任务,我可以使用一个池,但如果有太多异步任务被卡住,我仍然会创建大约 150- 200 个异步任务,对我来说太多了......

大家怎么看?我认为线程在这里会做得更好:

  1. 一直跑到死为止
  2. 尝试从队列中获取作业,如果不是作业,请等待。
  3. 如果有工作,请获取并开始处理。
  4. 每个请求都单独、串行地处理并阻塞线程。
  5. 一旦确实继续“2”。
  6. 适配器使用 startLoadingImage() 为需要显示的 View 完成的每个入队都会创建一个新作业并在等待锁上调用通知。

如果我想并行执行多个 GET\POST 请求,我可以使用线程池优化此代码。此外,我正在缓存我已经下载\加载的图像,以便在下次访问时快速加载。这个想法是尽量减少 GC 和列表滞后。

最佳答案

我实现了这样的东西:

/** Contains all the pending requests for thumbnails. */
private LinkedList<Uri> mPendingThumbnailRequests = new LinkedList<Uri>();

private ThumbnailGetter mThmGetter = null;
/**
* Asynchronous process for retrieving thumbnails from Uris.
*/
private class ThumbnailGetter extends AsyncTask<Uri, Integer, Uri> {
private final String LOG_TAG = ThumbnailGetter.class
.getSimpleName();
/** The Uri beeing processed */
private Uri mUri = null;
/*
* (non-Javadoc)
*
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Uri doInBackground(Uri... uris) {
// We process Uris one after another... so the Array contains
// only one Uri.
mUri = uris[0];
// Let the ThumbnailLoader do the job.
Uri result = ItemsLoader.getThumbnail(mContext, mUri);
return result;
}
/*
* (non-Javadoc)
*
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(Uri result) {
super.onPostExecute(result);
// Give the retrieved thumbnail to the adapter...
mImageAdapter.updateThumbUri(mUri, result);
// then process any other pending thumbnail request.
if (!mPendingThumbnailRequests.isEmpty()) {
mThmGetter = new ThumbnailGetter();
mThmGetter.execute(mPendingThumbnailRequests.poll());
}
}
}

然后我将 Uris 添加到加载使用:

if (!mPendingThumbnailRequests.contains(imageUri)) {
mPendingThumbnailRequests.offer(imageUri);
if (mThmGetter == null
|| mThmGetter.getStatus() == AsyncTask.Status.FINISHED) {
// If the previous instance of the thumbnail getter has
// finished, start a new one.
mHandler.sendEmptyMessage(MSG_SHOW_INDETERMINATE_PROGRESS);
mThmGetter = new ThumbnailGetter();
mThmGetter.execute(mPendingThumbnailRequests.poll());
}
}

这甚至允许您使用 mPendingThumbnailRequests.remove()

取消请求

完整的实现在这里: http://code.google.com/p/emailalbum/source/browse/EmailAlbumAndroid/trunk/src/com/kg/emailalbum/mobile/creator/SelectPictures.java

关于android - 许多 AsyncTasks 产生的 AsyncTask 性能问题。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com