2011-10-30 14 views
1

私の活動の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; 
    } 
} 

答えて

1

は()を追加します

Object savedInstance = getLastNonConfigurationInstance(); 
    if(savedInstance instanceof MyDeleteAsyncTask){ 
     //it's a MyDeleteAsyncTask 
    }else if(savedInstance instanceof MyLoadAsyncTask){ 
     //it's a MyLoadAsyncTask 
    } 
+0

エーム、とても簡単ですか?どうもありがとう。 –

1

それらの内部で複数の実行AsyncTasksを持って活動に対処するための最良の方法は、実際に実行されているもののすべてを含むオブジェクトを返し、自動的にonCreate()にそのコンテキストのすべてを再初期化することであると私を見つけました。例えば。

private class AsyncTaskList() { 
    List<ActivityTask> tasks; //interface all of your AsyncTasks implement 
    public void addTask() { /* add to list*/ } 
    public void completeTask { /* remove from list */ } 
    public void attachContext(Activity activity) { 
    for (ActivityTask task : tasks) { 
     //You can also check the type here and do specific initialization for each AsyncTask 
     task.attachContext(activity); 
    } 
    } 
} 

public void onCreate(Bundle bundle) { 
    AsyncTaskList taskList = (AsyncTaskList) getLastNonConfigurationInstance(); 
    if (taskList != null) { 
    taskList.attachContext(this); 
    } 
    ... 
} 

これで、タスクの開始/終了時にタスクを追加および削除するだけで済みます。あなたのonCreateで

+0

ありがとうございました。私はどこかで拡張されたApplicationクラスと同様の概念を見ました。私はそのように行かなければならないと私は静かではない。とにかく、ありがとう。 –

関連する問題