gpt4 book ai didi

android - 当启动 Activity 在它仍在运行时停止/销毁时,AsyncTask 会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:50 24 4
gpt4 key购买 nike

我见过几个与我的问题几乎相同的问题,但我找不到一个完整的答案来满足我所有的疑问。所以我在这里。假设你有一个内部类的 Activity ,它扩展了 AsyncTask 类如下:

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 被暂停或销毁(可能两种情况不同).. 那么,DownloadImageTask 的方法可以触发在 Activity UI 线程上运行的 DownloadImageTask 可能会尝试访问 Activity 的方法(它是一个内部类,因此它可以访问外部类的方法和实例变量)并暂停或销毁 Activity,例如下面示例中对 findViewByID 的调用。然后会发生什么?它会默默地失败吗?它会产生任何异常吗?是否会通知用户出现问题?

如果我们应该注意在调用 running-on-UI 方法时启动线程(在本例中为 Activity)仍然存在,我们如何从 AsyncTask 中完成它?

如果您发现这是一个重复的问题,我很抱歉,但也许这个问题更明确一些,有人可以更详细地回答

最佳答案

考虑这个任务(其中 R.id.test 指的是我 Activity 布局中的有效 View ):

public class LongTaskTest extends AsyncTask<Void, Void, Void>{
private WeakReference<Activity> mActivity;
public LongTaskTest(Activity a){
mActivity = new WeakReference<Activity>(a);
}
@Override protected Void doInBackground(Void... params) {
LogUtil.d("LongTaskTest.doInBackground()");
SystemClock.sleep(5*60*1000);
LogUtil.d("mActivity.get()==null " + (mActivity.get()==null));
LogUtil.d("mActivity.get().findViewById(R.id.frame)==null " + (mActivity.get().findViewById(R.id.test)==null));
return null;
}
}

如果我像这样从 Activity 的 onCreate 运行这个任务:

public class Main extends Activity {
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.testlayout);
new LongTaskTest(this).execute();
finish();
}
}

无论我让后台线程休眠多长时间,我的日志总是显示:

LongTaskTest.doInBackground()
mActivity.get()==null false
mActivity.get().findViewById(R.id.frame)==null false

也就是说, Activity 及其 View 似乎保持 Activity 状态(即使我通过 DDMS 手动发出 GC)。如果我有更多时间,我会查看内存转储,但除此之外我真的不知道为什么是这种情况......但在回答您的问题时,似乎是:

  • 它会悄无声息地失败吗?没有
  • 它会产生任何异常吗?没有
  • 是否会通知用户出现问题?没有

关于android - 当启动 Activity 在它仍在运行时停止/销毁时,AsyncTask 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117031/

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