2011-10-30 15 views
1

在我的一個活動中,我最多有六個不同的AsyncTasks可以運行在不同的事件上。所有AsyncTasks優雅地處理方向變化(至少我希望如此)。在onRetainNonConfigurationInstance()我確實返回當前運行的AsyncTask的AsyncTask對象。後來,在onCreate()期間,我需要找出從getLastNonConfigurationInstance()返回的AsyncTask對象。如何找出AsyncTask正在運行的是什麼?

我在所有onPostExecute()方法中使用Activity上下文來獲取新活動(如果有新活動的話)。我在StackOverflow中發現了這個概念,並且稍微修改了一下,因爲我不喜歡那種「垃圾箱在方向更改上運行任務」的範例。希望這個概念是正確的。

在下面顯示的代碼中,您會發現兩個不同的AsyncTasks。在onRetainNonConfigurationInstance()期間,我將返回當前正在運行的AsyncTask。我的問題在onCreate()內。如何找出返回的對象?什麼AsyncTask在方向變化碰撞時運行?

這兩個AsyncTasks在很多領域都不同(這裏沒有顯示),所以我沒有使用自己的擴展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

在你的onCreate()地址:

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

Ahem,那麼容易?非常感謝。 –

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); 
    } 
    ... 
} 

現在你只需要添加和刪除任務,當他們開始/完成。

+0

非常感謝你。我在某處看到了類似的擴展應用程序類的概念。我不確定我是否應該這樣去。嗯,謝謝。 –

相關問題