私の活動の1つでは、さまざまなイベントで実行できる最大6つの異なるAsyncTaskがあります。すべてのAsyncTaskはオリエンテーションの変更を正常に処理します(少なくとも私はそう望みます)。 onRetainNonConfigurationInstance()では、現在実行中のAsyncTaskのAsyncTaskオブジェクトを返します。後で、onCreate()の実行中に、AsyncTaskオブジェクトがgetLastNonConfigurationInstance()から返されたものを調べる必要があります。どのAsyncTaskが実行されているかを調べるには?
すべてのonPostExecute()メソッドでActivityコンテキストを使用して、新しいアクティビティを取得します(新しいアクティビティがある場合)。私はStackOverflowでこのコンセプトを見つけましたが、それは少し変更しました。なぜなら、「ゴミ箱をオリエンテーション変更で実行する」パラダイムが好きではないからです。このコンセプトが正しいことを願っています。
次のコードには、2つの異なるAsyncTaskがあります。 onRetainNonConfigurationInstance()の実行中に、現在実行中のAsyncTaskを返します。私の問題はonCreate()内にあります。返されるオブジェクトを見つける方法オリエンテーションの変更が起こったとき、AsyncTaskは何を実行していましたか?
両方のAsyncTaskは、多くの領域で異なります(ここでは示されていません)ので、独自の拡張AsyncTaskベースオブジェクトを使用しませんでした。
事前に感謝します。
public class MyActivity extends ListActivity {
// First AsyncTask
private class MyLoadAsyncTask extends AsyncTask<Void, Void, Cursor> {
private MyActivity context;
private MyProgressDialog dialog;
public MyLoadAsyncTask(MyActivity context) {
super();
this.context = context;
}
@Override
protected Cursor doInBackground(Void... voids) {
return MyApplication.getSqliteOpenHelper().fetchSoomething();
}
@Override
protected void onPostExecute(Cursor cursor) {
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
if (cursor != null) {
context.startManagingCursor(cursor);
context.adapter = new InternetradiosAdapter(context,
R.layout.row,
cursor,
new String[] { "text1",
"text2" },
new int[] { R.id.row_text1,
R.id.row_text2 });
if (context.adapter != null) {
context.setListAdapter(context.adapter);
}
}
context.loadTask = null;
}
@Override
protected void onPreExecute() {
dialog = MyProgressDialog.show(context, null, null, true, false);
}
}
private class MyDeleteAsyncTask extends AsyncTask<Void, Void, Boolean> {
// Second AsyncTask
private MyActivity context;
private MyProgressDialog dialog;
private long id;
public MyDeleteAsyncTask(MyActivity context, long id) {
super();
this.context = context;
this.id = id;
}
@Override
protected Boolean doInBackground(Void... voids) {
return MyApplication.getSqliteOpenHelper().deleteSomething(id);
}
@Override
protected void onPostExecute(Boolean result) {
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
if (result) {
context.doRefresh();
}
context.deleteTask = null;
}
@Override
protected void onPreExecute() {
dialog = MyProgressDialog.show(context, null, null, true, false);
}
}
private MyDeleteAsyncTask deleteTask;
private MyLoadAsyncTask loadTask;
@Override
public void onCreate(Bundle bundle) {
// ...
// What Task is returned by getLastNonConfigurationInstance()?
// ...
// xxxTask = (MyXxxAsyncTask) getLastNonConfigurationInstance();
// ...
if (deleteTask != null) {
deleteTask.context = this;
deleteTask.dialog = MyProgressDialog.show(this, null, null, true, false);
} else if (loadTask != null) {
loadTask.context = this;
loadTask.dialog = MyProgressDialog.show(this, null, null, true, false);
} else {
loadTask = new MyLoadAsyncTask(this);
loadTask.execute();
}
}
@Override
public Object onRetainNonConfigurationInstance() {
if (deleteTask != null) {
if (deleteTask.dialog != null) {
deleteTask.dialog.dismiss();
deleteTask.dialog = null;
return deleteTask;
}
} else if (loadTask != null) {
if (loadTask.dialog != null) {
loadTask.dialog.dismiss();
loadTask.dialog = null;
return loadTask;
}
return null;
}
}
エーム、とても簡単ですか?どうもありがとう。 –