読者です 読者をやめる 読者になる 読者になる

【Android】非同期処理はAsyncTaskをEventBusで

 

非同期処理はAsyncTaskで行うことが多いですが、

EventBusで「AsyncTask」を使用する際の説明になります。

 

EventBusにはいくつか種類があります。

Google Guava

②square/otto

③greenrobot

 

今回は、③greenrobot を使用しています。

 

github.com

------------------------------------------------------------------------------------------------

AndroidManifest.xml

dependencies {
  compile 'org.greenrobot:eventbus:3.0.0' ※greenrobotの場合
}

------------------------------------------------------------------------------------------------

MainFragment.java

public class MainFragment {

  @Override
  public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
  }
  @Override
  public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
  }

  private void search() {
    //AsyncTaskを実行 AsyncTaskはモデルから呼び出すようにします。
    MainModel model = new MainModel();
    model.asyncTask();
  }

  // イベントハンドラ  (コールバックメソッド)
  @Subscribe
  public void onEvent(AsyncTaskEventModel event) {
    ArrayList<String> list = event.getResult();

    ~
  }

}

------------------------------------------------------------------------------------------------

MainModel.java

public class MainModel {

  public void asyncTask() {
    //AsyncTask実行
    MyTask mytask = new MyTask();
    mytask.execute();
  }
  public void setResult(ArrayList<String> list) {//セッター

    //イベント用のモデルクラス(AsyncTaskEventModel)に通知
    EventBus.getDefault().post(new AsyncTaskEventModel(list));
  }
  class MyTask extends AsyncTask<String, Integer, ArrayList<String>> {

    @Override
    protected void onPreExecute() {
    }
    @Override
    protected ArrayList<String> doInBackground(String... value) {

      ArrayList<String> list = new ArrayList<String>();
      try {
        Thread.sleep(1000); //1秒停止
        ※OKHTTPなどでサーバ処理
      } catch (Exception e) {
        e.printStackTrace();
      }
      ~
      return list;
    }
    @Override
    protected void onPostExecute(ArrayList<String> list) {//返却値
      setResult(list);
    }
  }
}

------------------------------------------------------------------------------------------------

AsyncTaskEventModel.java

public class AsyncTaskEventModel {

  private ArrayList<String> list;

  public AsyncTaskEventModel(ArrayList<String> list) {
    this.list = list;
  }
  public ArrayList<MyItunes> getResult() {
    return list;
  }
}

 

以上です。