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