我对破坏活动和对象有疑问。
当我从 AsyncTask 附加和分离活动时,我不会从 asynctask 更改 ArrayAdapter(请参阅代码)。所以,我得到的是多个活动被附加和分离(应该改变方向),只有一个任务正在运行和修改一个适配器,而这个适配器又是创建任务的第一个活动的那个。因此,当我在 onCreate() 中附加任务时,我只是将适配器设置为包含任务的适配器,而该适配器又处理了所有值(在示例中只是一个虚拟数字列表)。
这怎么可能?我认为 onDestroy() 会擦除活动本身及其属性,因此在尝试从 AsynkTask 访问原始活动的 ArrayAdapter 时,我会得到一个空指针异常或类似的东西,但下面的代码有效!
private static class TestingTask extends AsyncTask<Void, Integer, Void> {
private TestingActivity mActivity; // extends ListActivity
private ArrayAdapter<String> mAdapter;
private boolean mIsFinished;
private TestingTask(Context activity) {
attach(activity);
mAdapter = (ArrayAdapter<String>)mActivity.getListAdapter();
mIsFinished = false;
}
private void attach(Context activity) {
mActivity = (TestingActivity)activity;
}
private void detach() {
mActivity = null;
}
protected Void doInBackground(Void... params) {
for (int i = 0; i < 100000; i++) {
publishProgress(i);
}
return null;
}
protected void onProgressUpdate(Integer... values) {
if (!isCancelled()) {
mAdapter.add(values[0].toString());
}
}
// ...
}
这是因为任务保持对 ArrayAdapter 对象的活动引用,因此它没有被删除?或者是别的什么?
我还经历了另一个“类似情况”,其中我从 onRetainNonConfigurationInstance() 返回了一个 Activity 的属性,比如说 A a,它对 B b 具有可见性(这是 Activity 的另一个属性)。然后,当尝试通过a访问b实例时,没有问题,我认为我需要一个包装器来保存两个实例(a和b),否则我会在尝试访问b时遇到异常(我这样做了实际上没有保存)。我不知道它是否与之前的情况有关,在这种情况下,我认为不可用的对象实际上存在,可能是因为对它们的活动引用导致没有删除?
谢谢!