在我的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);
}
}
它看起來很好...抽象類拋出一個錯誤「類型參數R隱藏類型R」,擴展類拋出「MyAsyncTask無法解析爲類型(創建類MyAsyncTask」。嗯,任何想法?提前致謝 –
是因爲R類嗎?嘗試將R參數改爲別的東西 - RES或X或其他什麼.. – Sameer
我可以讓抽象類編譯的唯一方法是使用此簽名「public abstract class MyAsyncTask extends AsyncTask 「and using C in onPostExecute。但是現在擴展類不會編譯」public class MyAsyncTaskImpl extends MyAsyncTask「給出」MyAsyncTask無法解析爲類型「,doInBackground不編譯並且想要我刪除「覆蓋」註釋。我可以編輯你的答案來顯示我改變了什麼嗎? –