我正在探索Android开发者网站并阅读一些文章。有一种方法可以使用AsyncTask推迟在列表视图中加载图像:
// Using an AsyncTask to load the slow images in a background thread
new AsyncTask<ViewHolder, Void, Bitmap>() {
private ViewHolder v;
@Override
protected Bitmap doInBackground(ViewHolder... params) {
v = params[0];
return mFakeImageLoader.getImage();
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (v.position == position) {
// If this item hasn't been recycled already, hide the
// progress and set and show the image
v.progress.setVisibility(View.GONE);
v.icon.setVisibility(View.VISIBLE);
v.icon.setImageBitmap(result);
}
}
}.execute(holder);
但是,对我而言,该代码似乎存在一些问题。假设我们从互联网加载图像,它们每个都需要几秒钟才能加载。
作为用户,如果我们滚动列表然后切换到另一个活动,将会在后台运行一些AsyncTasks并占用一些带宽,而我们可能需要在新的前台活动中使用它。
您通常如何使用他们的方法处理该案例?在回收视图时,您是否会杀死与持有者关联的AsyncTask?您是否在AsyncTasks仍在运行的适配器中跟踪并在活动停止时取消它们?其他一些方法吗?
我的问题主要是关于构建清理工件以解决该问题(而不是实施)
答案 0 :(得分:2)
我想说大部分时间下载都没有足够的时间让它成为一个问题,但如果确实如此,你就应该杀掉它们。同样在他们的实现中,他们下载图像并检查视图是否已被重用。如果您有很长的延迟,则应在重复使用时取消该任务。请注意,Android版本之间的任务执行顺序不同。来自docs:
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。