2012-08-24 37 views
3

在我的Apps中,我通常有很多AsyncTasks。它們看起來都一樣,因此共享相同的設計。所以我想進一步優化這一點,並創建一個通用的MyAsyncTask,從中我的AsyncTasks擴展。但我不知道該怎麼做。想要創建一個通用的AsyncTask - 如何?

這是我的一個AsyncTasks。他們都不同,只有在方法/ VAR提供*包圍:

public class OneOfMyAsyncTasks extends AsyncTask<Void, Void, ***Cursor***> { 

    private Context      context; 
    private MyProgressDialog    dialog; 
    private OnAsyncTaskCompletedListener listener; 
    private String      search; 
    private int       task_id; 

    public OneOfMyAsyncTasks(int task_id, Context context, OnAsyncTaskCompletedListener listener) { 
     super(); 

     this.context = context; 
     this.listener = listener; 
     this.task_id = task_id; 
    } 


    public OneOfMyAsyncTasks(int task_id, Context context, OnAsyncTaskCompletedListener, 
         ***String search***) { 
     super(task_id, context, listener); 

     ***this.search = search;*** 
    } 

    protected void attach(Context context, OnAsyncTaskCompletedListener listener) { 
     this.context = context; 
     this.listener = listener; 

     processCreateDialog(); 
    } 

    protected void detach() { 
     processDismissDialog(); 

     if (context != null) { 
      context = null; 
     } 

     if (listener != null) { 
      listener = null; 
     } 
    } 

    @Override 
    protected ***Cursor*** doInBackground(Void... voids) { 
     ***return MyApplication.getSqliteOpenHelper().fetchSomething(search);*** 
    } 

    @Override 
    protected void onPostExecute(***Cursor cursor***) { 
     if (listener != null) { 
      listener.onAsyncTaskCompleted(task_id, ***cursor***); 
     } 

     detach(); 
    } 

    @Override 
    protected void onPreExecute() { 
     processCreateDialog(); 
    } 

    private void processCreateDialog() { 
     if (context != null) { 
      dialog = MyProgressDialog.show(context, null, null, true, false); 
     } 
    } 

    private void processDismissDialog() { 
     if (dialog != null) { 
      try { 
       dialog.dismiss(); 
      } catch (Exception exception) { 
      } 

      dialog = null; 
     } 
    } 
} 

我的想法是創造,它包含所有的除外如上所示MyAsyncTask:

  • 方法doInBackground
  • 方法onPostExecute
  • 第二個構造
  • ...和的AsyncTask本身的簽名(第三PARAM eter)

這些必須從通用MyAsyncTask擴展的特定AsyncTasks中設置。

任何幫助,高度讚賞。

編輯:這是我迄今爲止所做的 - 沒有成功。擴展類拋出兩個寫在下面的代碼中的錯誤。首先是抽象類:

public abstract class MyAsyncTask<A, B, C> extends AsyncTask<A, B, C> { 

     protected Context      context; 
     protected MyProgressDialog    dialog; 
     protected OnAsyncTaskCompletedListener listener; 
     protected int       task_id; 

     public MyAsyncTask(int task_id, Context context, OnAsyncTaskCompletedListener listener) { 
      super(); 

      this.context = context; 
      this.listener = listener; 
      this.task_id = task_id; 
     } 

     protected void attach(Context context, OnAsyncTaskCompletedListener listener) { 
      this.context = context; 
      this.listener = listener; 

      processCreateDialog(); 
     } 

     protected void detach() { 
      processDismissDialog(); 

      if (context != null) { 
       context = null; 
      } 

      if (listener != null) { 
       listener = null; 
      } 
     } 

     @Override 
     protected void onPostExecute(C result) { 
      if (listener != null) { 
       listener.onAsyncTaskCompleted(task_id, result); 
      } 

      detach(); 
     } 

     @Override 
     protected void onPreExecute() { 
      processCreateDialog(); 
     } 

     private void processCreateDialog() { 
      if (context != null) { 
       dialog = MyProgressDialog.show(context, null, null, true, false); 
      } 
     } 

     private void processDismissDialog() { 
      if (dialog != null) { 
       try { 
        dialog.dismiss(); 
       } catch (Exception exception) { 
       } 

       dialog = null; 
      } 
     } 
    } 

這裏有一個擴展該類的思想。這兩個錯誤寫在代碼中:

public class MyAsyncTaskImpl extends MyAsyncTask<Void, Void, Cursor> { 
    // --> Error: MyAsyncTask cannot be resolved to a type - Create class 'MyAsyncTask<T1, T2, T3>' 

    private String search; 

    public MyAsyncTaskImpl(int task_id, Context context, OnAsyncTaskCompletedListener listener, String search) { 
     super(task_id, context, listener); 

     this.search = search; 
    } 

    @Override 
    protected Cursor doInBackground(Void... voids) { 
     // --> Error: The method doInBackground(Void...) of type MyAsyncTaskImpl must override or implement a supertype method - Remove '@Override' annotation   

     return MyApplication.getSqliteOpenHelper().fetchSomething(search); 
    } 
} 

回答

2

您可以使用兩個泛型類型參數創建抽象基類 - R - 用於結果類型,T用於搜索參數。

public abstract class MyAsyncTask<R, T> extends AsyncTask<Void, Void, R> { 
    private Context context; 
    private MyProgressDialog dialog; 
    private OnAsyncTaskCompletedListener listener; 
    private T search; 
    private int task_id; 

    public MyAsyncTask(int task_id, Context context, 
      OnAsyncTaskCompletedListener listener) { 
     super(); 

     this.context = context; 
     this.listener = listener; 
     this.task_id = task_id; 
    } 

    public MyAsyncTask(int task_id, Context context, 
      OnAsyncTaskCompletedListener listener, T search) { 
     this(task_id, context, listener); 

     this.search = search; 
    } 

    protected void attach(Context context, OnAsyncTaskCompletedListener listener) { 
     this.context = context; 
     this.listener = listener; 

     processCreateDialog(); 
    } 

    protected void detach() { 
     processDismissDialog(); 

     if (context != null) { 
      context = null; 
     } 

     if (listener != null) { 
      listener = null; 
     } 
    } 

    @Override 
    protected void onPostExecute(R result) { 
     if (listener != null) { 
      listener.onAsyncTaskCompleted(task_id, result); 
     } 

     detach(); 
    } 

    @Override 
    protected void onPreExecute() { 
     processCreateDialog(); 
    } 

    private void processCreateDialog() { 
     if (context != null) { 
      dialog = MyProgressDialog.show(context, null, null, true, false); 
     } 
    } 

    private void processDismissDialog() { 
     if (dialog != null) { 
      try { 
       dialog.dismiss(); 
      } catch (Exception exception) { 
      } 

      dialog = null; 
     } 
    } 
} 

然後你可以如下具體的實現擴展該類:

public class MyAsyncTaskimpl extends MyAsyncTask<Cursor, String> { 

    public MyAsyncTaskimpl(int task_id, Context context, 
      OnAsyncTaskCompletedListener listener, String search) { 
     super(task_id, context, listener, search); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected Cursor doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 
+0

它看起來很好...抽象類拋出一個錯誤「類型參數R隱藏類型R」,擴展類拋出「MyAsyncTask無法解析爲類型(創建類MyAsyncTask 」。嗯,任何想法?提前致謝 –

+0

是因爲R類嗎?嘗試將R參數改爲別的東西 - RES或X或其他什麼.. – Sameer

+0

我可以讓抽象類編譯的唯一方法是使用此簽名「public abstract class MyAsyncTask extends AsyncTask 「and using C in onPostExecute。但是現在擴展類不會編譯」public class MyAsyncTaskImpl extends MyAsyncTask 「給出」MyAsyncTask無法解析爲類型「,doInBackground不編譯並且想要我刪除「覆蓋」註釋。我可以編輯你的答案來顯示我改變了什麼嗎? –

0

您可以創建一個Abstract Class。這將允許您實現所有的方法,並將任務相關的方法保留爲Abstract。這將允許任何人擴展自己的(抽象)類,並迫使他們實現這些特定的方法。

+0

是的,這就是我試圖做的,但我不能讓抽象類和擴展類和這些的正確的簽名來自原始AsyncTask類的必需方法。 –