非同期通信のコールバック
AsyncTaskの処理が終了した後で、何かしたいときに使います。
MainActivity
public class MainActivity extends AppCompatActivity{
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
AsyncCallBack asyncCallBack = new AsyncCallBack();
MyAsyncTask myAsyncTask = new MyAsyncTask(asyncCallBack);
myAsyncTask.execute();
}
public class AsyncCallBack{
public void callBack(String s){
// AsyncTask終了後にしたい処理を記述
tv.setText(s);
}
}
}
MyAsyncTask
public class MyAsyncTask extends AsyncTask<Void,Void,String> {
private MainActivity.AsyncCallBack callBack = null;
public MyAsyncTask(MainActivity.AsyncCallBack callBack){
this.callBack = callBack;
}
@Override
protected String doInBackground(Void... aVoid) {
return "success";
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
callBack.callBack(s);
}
}
AnsycTaskを汎化/共通化するSampleCode
非同期通信する度に、AsyncTaskコードを書いてたら、すごく大変。
呼出元からは
AsyncCallBack callBack = new AsyncCallBack();
AsyncTask asyncTask = new AsyncTask(callback);
って感じで、どこからでも呼び出せるようにする。
上記「非同期通信のCallBack」の方法だと、AsyncTaskのコンストラクタで
<MainActivity.AsyncCallBack asyncCallBack>で引数を受けたけど、これだと汎化できない。
なので、AsyncCallBack型を宣言できるようにするためにInterfaceを使って
<AsycnCallBack asyncCallBack>で引数を受けられるようにして汎化する。
あとHashMapを使ってパラメーターを持ち運びできるようにしてみる。
ではインターフェイス!
CallBack.interface
interface CallBack{
public void Receiver(Map<String,String> map);
}
これで、CallBack型の引数を使えるようになれた!
AsyncTaskSample.java
public class AsyncTaskSample extends AsyncTask<Map<String,String>,Void,Map<String,String>{
AsyncTaskCallBack callback;
public AsyncTaskSample(AsyncTaskCallBack callBack){
this.callback = callBack;
}
@Override
protected Map<String,String> doInBackground(Map<String,String>... map){
return map[0];
}
@Override
protected void onPostExecute(Map<String,String> map){
super.onPostExecute(map);
callback.Receiver(map);
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements CallBack{ // CallBackを拡張する
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncTaskSample async = new AsyncTaskSample(this);
Map<String,String> map = new HashMap<String,String>();
map.put("key","MainActivity");
async.execute(map);
new SampleClass.SampleClass();
}
@Override
public void Receiver(Map<String,String> map) {
Log.d("=====>",map.get("key");
}
SampleClass.java
public class SampleClass implemants CallBack{ //CallBackを拡張する
void SampleClass(){
AsyncTaskSample async = new AsyncTaskSample(this);
Map<String,String> map = new HashMap<String,String>();
map.put("key","SampleClass");
async.execute(map);
}
@Override
public void Receiver(Map<String,String> map){
Log.d("=====>",map.get("key");
}
}