2012年2月18日

【Android】非同期処理

今回はAndroidの非同期処理をコードを中心に解説いたします。

Activityに処理終了を知らせたい部分を組み込みつつ、
非同期処理を実装します。

ちなみに、AsyncTaskは一時期良く使ってましたが、
最近はThreadとListenerを用いた組み方にしております。


MainActivity.java

public class MainActivity extends Activity implements Listener {
  @Override
  public void onCreate(Bundle savedInstanceState){
    // do something here...
    MultiTask task = new MultiTask(this);
    task.doMultiTask();
  }

  @Override
  public void onFinishMultiTask(int sum) {
    // do something here
  }
}

MultiTask.java

public class MultiTask {
  public interface Listener {
    public void onFinishMultiTask(int sum);
  }

  private Listener listener;

  public MultiTask(Listener listener) {
    this.listener = listener;
  }

  public void doMultiTask(){
    try {
      new Thread(new Runnable(){
        @Override
        public void run() {
          int sum = 0;
          for(int i = 0; i < 10000; i++) {
            sum += i;
          }
          if(listener != null) {
            listener.onFinishMultiTask(sum);
          }
        }
      }).start();
    } catch(Exception e) {
      Log.e(TAG, e.getMessage(), e);
    }
  }
}

解説いたしますと、
ActivityのonCreateのdoMultiTaskでThreadを実行しており、
onCreateはfor文の終了を待たずに先へ進みます。

for文の加算が終了したら、Listenerを用いてActivityへ帰ってきます。
onFinishMultiTaskでMainActivityでしなければいけない処理を実装します。

その際、UIを変更する場合はHandlerを用いないとエラーとなります。

Handlerの解説はまたどこかでいたします。