3

私のアプリには、通常、多くの 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);
    }
}
4

2 に答える 2

2

結果型の R と検索引数の T という 2 つのジェネリック型引数を持つ抽象基本クラスを作成できます。

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

}
于 2012-08-24T12:28:10.047 に答える
0

を作成できますAbstract Class。これにより、すべてのメソッドを実装し、タスクに依存するメソッドを抽象として残すことができます。これにより、誰でも独自の (抽象) クラスを拡張し、これらの特定のメソッドを強制的に実装できるようになります。

于 2012-08-24T12:10:57.233 に答える