rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

AsyncTask#doInBackground()実行後の処理を呼び出し(Activity)側に記述する Android開発

2021 Jul. 24.
2020 May 09.
2020 Mar. 21.
2019 Aug. 18.
2019 Aug. 17.

AsyncTaskのdoInBackground()実行後の処理をAsyncTaskを呼び出したActivity側に記述する方法(onPostExecute()の中だけでは処理できない場合に使える)

・AsyncTask#execute()実行の前に、Activity側で、
 AsyncTask#setListener(createListener())を実行する。(setListener、
  createListenerは任意のメソッド名)
 (Activity側でdoInBackground()実行後の処理を記述したcreateListener()関数を
  AsyncTaskに渡している)

  createListener()内にはonSuccess()メソッドを置き、doInBackground()実行後の
  処理を記述しておく(onSuccessは任意のメソッド名)
  (下記のListenerインターフェースのonSuccess()抽象メソッドの実装)

  createListener()はAsyncTask#setListener()によってAsyncTask内のlistenerに渡さ
  れる
    (AsyncTask.java
     void setListener(Listener listener) {
       this.listener = listener;
     }

・AsyncTask内のlistenerはAsyncTask内で定義されたListenerインターフェースの
 インスタンスであり、ListenerインターフェースにはAsyncTask終了時に実行す
 る抽象メソッドonSuccess()を置いておく(Listenerは任意のインターフェース名)

・onPostExecute()内でlistener.onSuccess()を実行すればActivity内のcreateListener()に
 書いたonSuccess()が実行される

(参考サイト)
https://teratail.com/questions/195681
https://akira-watson.com/android/asynctask.html

(MyActivity.java)

public class MyActivity extends AppCompatActivity {

    Button buttonStartTask;

    buttonStartTask.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            myAsyncTask = new MyAsyncTask();

            /*
             * MyAsyncTask内のListenerインターフェース型変数listenerに
             * createListener()をセットする
             *    createListener()でListenerインターフェースの
             *    抽象メソッドonSuccess()が実装される。
             *   onSuccess()の実装コードの中にAsyncTask実行後の処理を記述しておく。
             *    MyAsyncTaskのonPostExecuteにlistener.onSuccess()を書いておけば実装コードを実行できる。
             */
            myAsyncTask.setListener(createListener());

            myAsyncTask.execute();
        }
    });

    /*
     * MyAsyncTask内のListenerインターフェースを実装する
     */
    private MyAsyncTask.Listener createListener() {
        return new MyAsyncTask.Listener() {

            /*
             * MyAsyncTask内のListenerインターフェースの抽象メソッドonSuccessを実装。
             * MyAsyncTask終了後に実行するコードを記述。
             */
            @Override
            public void onSuccess(String result) {
                CODES_TO_RUN_AFTER_MyAsyncTask;
            }
        };
    }


}


(MyAsyncTask.java)

public class MyAsyncTask extends AsyncTask<Void, Void, String> {
    private Listener listener;

    /*
     * Listenerインターフェースの定義。
     * 抽象メソッドonSuccess()は、MyAsyncTask内で実行させたい処理。
     * 抽象メソッドonSuccess()は、MyAsyncTaskを呼び出すMyActivity内の
     * createListener()内で実装されている。
     */
    interface Listener {
        void onSuccess(String str);
    }
   
    void setListener(Listener listener) {
        this.listener = listener;
    }

    @Override
    protected String doInBackground(Void... params) {
        //WriteYourCodesToBeExecutedInBackgroundHere
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        // WriteYourCodesToBeExecutedOnPostExecuteHere;

        /*
         * onSuccess()メソッド実行
         */
        listener.onSuccess(result);
            /*
            listenerはMyAsyncTask.Listener型。
                MyActivityがmyAsyncTaskを生成した時に実行
                されるmyAsyncTask.setListener(createListener())により、
                MyAsyncTask.Listener型インスタンスがセットされている。
            createListener()によるMyAsyncTask.Listener型インスタンスは
            onSuccess()関数を保持している。
            onSuccess()関数にはMyAsyncTask実行後に行うコードが書かれている。
                onSuccess()関数は、MyActivity内の
                void MyAsyncTask.Listener createListener() {} に定義されている。
            */

        return;
    }
}