我正在探索Android开发人员网站并阅读一些文章。目前使用的AsyncTask列表视图defering图像加载的一种方式:制作ListView滚动平滑
// 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仍在运行的适配器,并在活动停止时将其全部取消?还有其他的方式吗?
我的问题主要是关于architecturing清洗件来解决这个问题(没有这么多的实现)
单独采取,下载可能需要一秒钟,但如果您获得了100个项目的列表或网格......您是否只在项目显示时才下载?如果你在扔东西呢? –
根据要求可以有各种各样的变化。您应该看一个有趣的示例是:http://androidxref.com/4.1.1/xref/development/samples/ApiDemos/src/com/example/android/apis/view/List13.java如果没有加载滚动时完成。您当然也可以将数据缓存在后台线程(可能包含在服务中),无论是闪存还是RAM。还有一些LruCache(http://developer.android.com/reference/android/support/v4/util/LruCache.html)可能会对这些问题感兴趣。 –