【发布时间】:2015-10-28 14:45:13
【问题描述】:
请注意,这个问题的灵感来自对 https://stackoverflow.com/a/33370816/519334 的评论。
我有一个持有者类,它属于一个 GridView-item 并引用了一个 ImageView
public static class Holder {
ImageView mRowImage;
String mImageUrl;
// neccessary to cancel unfinished download
BitmapLoaderAsyncTask mDownloader;
}
相应的 GridItemAdapter 使用 AsyncTask 来获取 GridItem 的图像
public class GridItemAdapter extends BaseAdapter {
@Override
public View getView(int position, ...) {
...
if (view == null) {
holder = ...
...
} else {
holder = (Holder) view.getTag();
}
...
// cancel unfinished mDownloader
if (holder.mDownloader != null) {
holder.mDownloader.cancel(false);
holder.mDownloader = null;
}
holder.mImageUrl = mImageUrls.get(position);
holder.mDownloader = new BitmapLoaderAsyncTask()
holder.mDownloader.execute(holder);
}
}
static class BitmapLoaderAsyncTask extends AsyncTask<Holder, Void, Bitmap> {
Holder mHolder;
protected Bitmap doInBackground(Holder... holders) {
mHolder = holders[0];
...
}
protected void onPostExecute(...) {
mHolder.mDownloader = null;
if (!isCancelled()) {
this.mHolder.mRowImage.setImageBitmap(image);
}
this.mHolder = null;
}
}
有评论提示此代码在方向更改后可能存在问题。
情景
- 网格处于横向模式
- GridItemAdapter 启动 BitmapLoaderAsyncTask#1 以加载 Image1.jpg
- 异步任务有 mHolder.mRowImage
- 网格方向从横向模式更改为纵向模式
- BitmapLoaderAsyncTask#1 完成并调用
onPostExecute(..) - (!!!) 在
onPostExecute(..)中,图像mHolder.mRowImage已更新。由于mHolder.mRowImage不再存在,因为方向发生了变化,所以应该会发生崩溃。
我有code similar to the described scenario 到目前为止,我还没有 (!!!) 崩溃。
我的问题
- 这只是巧合,还没有 (!!!) 崩溃?
- 是否有一个简单的解决方案来检查
onPostExecute(..)mHolder.mRowImage不再有效? - 或者 Android 中有什么东西可以保护
AsyncTask?
【问题讨论】:
标签: android android-asynctask android-adapter android-orientation