7

In an existing app I have an activity with an inner class which extends AsyncTask, this looks like the following:

public class Activity_1 extends BaseActivity {
    ....
    new async().execute();
    ...

    public class asyncextends AsyncTask<Void, Void, String> {
        protected String doInBackground(Void... progress) { ... }
        protected void onPreExecute() { ... }
        protected void onPostExecute(String result) { ... }
    }
}

Now, I need to call the same doInBackground-method from another activity, but the onPostExecute() of the this inner class operates on some local UI variables and hence it's not possible to use it from outside the clas. Is there any way I can call this AsyncTask, and just override the onPostExecute andonPreExecute-method, or shall I create yet another inner-class in the other activity, do the same background thing (of course move it to common utility-class or something), etc...?

4

4 に答える 4

23

別の抽象パッケージ プライベート クラスを作成し、メソッドを拡張AsyncTaskして実装することができます。doInBackground()

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }
}

そして、あなたの活動では、実装とメソッドから継承するだけですMyAsyncTask(ちなみに、新しいクラスはおそらくプライベートにする必要があります):onPostExecute()onPreExecute()

public class Activity_1 extends BaseActivity {

    ...
    new Async1().execute();
    ...

    private class Async1 extends MyAsyncTask {
        @Override
        protected void onPreExecute(){ 
            // Activity 1 GUI stuff
        }

        @Override
        protected void onPostExecute(String result) {
            // Activity 1 GUI stuff
        }
    }
}

onPreExecuteとにいくつかの一般的なアクションも含まれている場合onPostExecuteは、次のパターンを適用できます。

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    public interface MyAsyncTaskListener {
       void onPreExecuteConcluded();
       void onPostExecuteConcluded(String result);  
    }

    private MyAsyncTaskListener mListener;

    final public void setListener(MyAsyncTaskListener listener) {
       mListener = listener;
    }

    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }

    @Override
    final protected void onPreExecute() {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPreExecuteConcluded();
    }

    @Override
    final protected void onPostExecute(String result) {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPostExecuteConcluded(result);
    }
}

次のようにアクティビティで使用します。

public class Activity_1 extends BaseActivity {

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(new MyAsyncTask.MyAsyncTaskListener() {
       @Override
       void onPreExecuteConcluded() {
           // gui stuff
       }

       @Override
       void onPostExecuteConcluded(String result) {
           // gui stuff
       }
    });
    aTask.execute();
    ...
}    

Activity実装することもできますMyAsyncTaskListener

public class Activity_1 extends BaseActivity implements MyAsyncTask.MyAsyncTaskListener {
    @Override
    void onPreExecuteConcluded() {
        // gui stuff
    }

    @Override
    void onPostExecuteConcluded(String result) {
       // gui stuff
    }

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(this);
    aTask.execute();
    ...

}

コードは頭から書いたので、誤りがあるかもしれませんが、アイデアを説明する必要があります。

于 2013-05-14T13:58:37.550 に答える
15

とてもシンプルで、メインクラスのオブジェクトを構築し、このように内部クラスを呼び出すだけです

 OuterMainClass outer = new OuterMainClass();
       outer.new InnerAsyncClass(param)
         .execute();

この回答は遅すぎて役に立ちませんが、他の人に役立つことを願っています.

ありがとう

于 2015-03-20T12:16:33.187 に答える
-1

1 つのクラスにあり、AsyncTask の doInBackground の任意のクラスで実行される 1 つの静的メソッドを作成すると、同じクラスや別のクラスでも UI を簡単に更新できます。

于 2014-01-22T08:03:24.570 に答える