私のアプリには、通常、多くの AsyncTasks があります。それらはすべて同じように見えるため、同じデザインを共有しています。したがって、これをもう少し最適化し、AsyncTasks を拡張する汎用 MyAsyncTask を作成したいと思います。しかし、私はそれを行う方法がわかりません。
これが私の AsyncTasks の 1 つです。それらはすべて、*で囲まれたメソッド/変数のみが異なります。
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
- 2 番目のコンストラクター
- ... および AsyncTask 自体の署名 (3 番目のパラメーター)
これらは、この汎用 MyAsyncTask から拡張された特定の AsyncTasks から設定する必要があります。
どんな助けでも大歓迎です。
編集:これが私がこれまでに行ったことです-成功しませんでした。拡張クラスは、次のコードに記述されている 2 つのエラーをスローします。まず、抽象クラス:
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;
}
}
}
そして、その抽象クラスを拡張するクラスのアイデアがここにあります。2 つのエラーは、コード内に記述されています。
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);
}
}