活動や物の破壊に疑問があります。
アクティビティをAsyncTaskにアタッチおよびデタッチしている間、ArrayAdapterをasynctaskから変更しません(コードを参照)。したがって、私が得たのは、複数のアクティビティがアタッチおよびデタッチされ(向きが変わるはずです)、1つのアダプタを実行および変更する1つのタスクだけです。これは、タスクを作成した最初のアクティビティからのものです。したがって、onCreate()でタスクをアタッチするときは、タスクを保持するアダプターをアダプターに設定するだけで、すべての値が処理されます(この例では、数字のダミーリストのみ)。
どうすればこれが可能ですか?onDestroy()はアクティビティ自体とその属性を消去すると思ったので、AsynkTaskから元のアクティビティのArrayAdapterにアクセスしようとすると、nullポインター例外などが発生しますが、以下のコードは機能します。
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()からアクティビティの属性を返した別の「同様のケース」を経験しました。たとえば、A aは、B b(アクティビティの別の属性)を可視化します。次に、aを介してbインスタンスにアクセスしようとすると、問題はなく、2つのインスタンス(aとb)を保持するためのラッパーが必要だと思いました。そうしないと、bにアクセスしようとすると例外が発生します(これは私が行います)。実際には保存しません)。私が利用できないはずだったオブジェクトが実際にそこにある前のケースが関連する幅であるかどうかはわかりません。おそらく、それらへのアクティブな参照が削除を引き起こさないためですか?
ありがとうございました!