0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-28

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

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");
   }
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?