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

【Android】非同期処理はAsyncTaskをObserverパターンで

 

Androidで非同期処理を行う場合、「AsyncTask」を使用することが多いですが、

デザインパターンの「Observerパターン」を使っての「AsyncTask」の説明に

なります。

 

Observerパターン

・オブジェクトの状態を観測して変更があったら通知される
・通知を感知し各処理を行う
・状態変化を知りたい対象にはObservableクラスを継承

 

AsyncTask(非同期処理)

・ThreadとHandlerのヘルパークラス
・モデルから使う
・モデルはObservableを継承
・モデルからの通知で画面を更新

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

▼Model

(Observableを継承+AsyncTaskクラスを実装)

public class MainModel extends Observable {

  ArrayList<String> list;
  public enum Event {
    START, FINISH,
  }
  public void asyncTask() {
    //Observer通知
    setChanged();
    notifyObservers(Event.START);
    //AsyncTask実行
    MyTask mytask = new MyTask();
    mytask.execute();
  }
  public ArrayList<String> getResutl() {//ゲッター
    return this.list;
  }
  public void setResult(ArrayList<String> list) {//セッター
    this.list = list;
    //Observer通知
    setChanged();
    notifyObservers(Event.FINISH);
  }
  //▼非同期処理
  //AsyncTask<String, Integer, ArrayList<String>>
  //第1引数 パラメータ
  //第2引数 プログレ
  //第3引数 返却値
  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);
    }
  }
}

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

▼呼び出し側
public class MainFragment extends Fragment {
  MainModel model = new MainModel();

  private void search() {
    ~
    //ObserverパターンでAsyncTaskを実行
    model.addObserver(observer);
    model.asyncTask();
  }
  private Observer observer = new Observer() {
    @Override
    public void update(Observable observable, Object data) {
      if (!(data instanceof MainModel.Event)) {
        return;
      }
      switch ((MainModel.Event)data) {
        case START:
          //プログレスダイアログ開始の実装
          break;
        case FINISH:
          //プログレスダイアログ終了の実装
          //結果のリストをもとに表示

          ArrayList<String> list = model.getResutl();

          ~
        break;
      }
    }
  };
}

 

以上です。