51歳からのプログラミング 備忘 Android非同期通信のコールバック AsyncTask終了後の処理　さらに汎化・共通化

# 非同期通信のコールバック

AsyncTaskの処理が終了した後で、何かしたいときに使います。


```java: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);
        }
    }
}
```

```java: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を使ってパラメーターを持ち運びできるようにしてみる。
<br>
ではインターフェイス！

```java:CallBack.interface
interface CallBack{
   public void Receiver(Map<String,String> map);
}
```
これで、CallBack型の引数を使えるようになれた！
<br>

```java: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);
   }
}
```

```java: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");
   }

```

```java: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");
   }
}
```