【发布时间】:2012-08-24 21:41:05
【问题描述】:
我见过几个几乎与我相同的问题,但我找不到一个完整的答案来满足我所有的疑问..所以我在这里..假设你有一个内部类扩展 @ 987654321@类是这样的:
public class MyActivity extends Activity {
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return DownloadImage(urls[0]);
}
protected void onPostExecute(Bitmap result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new DownloadImageTask().execute("http://mysite.com/image.png")
}
}
假设在DownloadImageTask仍在后台运行时activity被暂停或销毁(可能两种情况不同)。那么,在activity UI线程上运行的DownloadImageTask的方法可以被触发并且DownloadImageTask 可能会尝试使用暂停或销毁的 Activity 访问 Activity 的方法(它是一个内部类,因此它可以访问外部类的方法和实例变量),如下例中对 findViewByID 的调用..然后会发生什么?它会默默地失败吗?它会产生任何异常吗?是否会通知用户出现问题?
如果我们应该注意在调用 UI 上运行的方法时启动线程(在本例中为 Activity)仍然处于活动状态,我们如何在 AsyncTask 中实现这一点?
如果您发现这是一个重复的问题,我很抱歉,但也许这个问题更加清晰,有人可以更详细地回答
【问题讨论】:
-
当您运行此代码时,它是否静默失败、产生任何异常或通知用户出现问题?
-
我还没有运行这样的代码,我会在接下来的几天里运行它。在我的应用程序实现之前,我想知道它。一旦我可以运行测试,我会更新这篇文章。谢谢@CommonsWare
-
我的意思是这种行为是无证的,特别是考虑到我们在活动中没有看到任何其他内容。
findViewById()可能会为R.id.img返回null,也可能不会。可以想象,这种行为可能会因设备而异,具体取决于 Android 操作系统版本、设备制造商更改和 ROM 模块。 -
“我觉得很奇怪,文档没有说明在这种情况下应该做什么”——我会先查看
findViewById()的返回值,而不是盲目地查看假设成功。我还强烈考虑使用保留的片段来管理您的AsyncTasks,或者以其他方式教您的AsyncTask在后台线程运行时活动可以来去去去(例如,用户旋转屏幕)。 -
听起来很合理。
标签: android android-asynctask background-process ui-thread