C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

AsyncTaskの終了などをActivityに通知するには, コールバックインタフェースを定義し, AsyncTaskに登録する.

リスナーの登録

  • src/AsyncTaskCallbacks.java
    • AsyncTaskCallbacksインタフェースを定義する.
    • onTaskFinished/onTaskCancelledメソッドを定義する.
package com.moonlight_aska.android.asynctask03;

public interface AsyncTaskCallbacks {
  public void onTaskFinished();  // 終了
  public void onTaskCancelled();  // キャンセル
}
  • src/SampleAsyncTask.java
    • コンストラクタで, コールバックを登録する.
    • AsyncTask終了時にコールされるAsyncTask#onPostExecuteメソッドで, AsyncTaskCallbacs#onTaskFinishedメソッドをコールする.
    • AsyncTaskキャンセル時にコールされるAsyncTask#onCancelledメソッドで, AsyncTaskCallbacks#onTaskCancelledメソッドをコールする.
package com.moonlight_aska.android.asynctask03;

import android.os.AsyncTask;
import android.util.Log;

public class SampleAsyncTask extends AsyncTask<Void, Long, Long> {
  private AsyncTaskCallbacks callback = null;
  private Long mSec;

  // コンストラクタ
  public SampleAsyncTask(AsyncTaskCallbacks callback) {
    this.callback = callback;
  }

  // バックグラウンド処理の前に実行される処理
  @Override
  protected void onPreExecute() {
    // TODO Auto-generated method stub
    Log.v("AsyncTask", "onPreExecute");
    mSec = 0L;
  }

  // バックグラウンド処理
  @Override
  protected Long doInBackground(Void... params) {
    // TODO Auto-generated method stub
    Log.v("AsyncTask", "doInBackground");
    try {
      for (int i=0; i<10; i++) {
        Thread.sleep(1000);
        mSec++;
        Log.v("AsyncTask", mSec + "sec");
        if (isCancelled()) {
          Log.v("AsyncTask", "CANCEL");
          break;
        }
      }
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return mSec;
  }

  @Override
  protected void onPostExecute(Long result) {
    // TODO Auto-generated method stub
    Log.v("AsyncTask", "onPostExecute");
    callback.onTaskFinished();
  }

  @Override
  protected void onCancelled() {
    // TODO Auto-generated method stub
    Log.v("AsyncTask", "onCancelled");
    callback.onTaskCancelled();
  }
}
  • src/MainActivity.java
    • SympleAsyncTaskのインスタンスを生成する.
    • AsyncTaskCallbacks#onTaskFinished/onTaskCancelledメソッドを実装する.
package com.moonlight_aska.android.asynctask03;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener, AsyncTaskCallbacks {
  private Button mBtn;
  private boolean mFlag = false;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBtn = (Button)findViewById(R.id.btn_id);
    // Buttonイベント
    mBtn.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    SampleAsyncTask task = new SampleAsyncTask(this);
    // 非同期処理開始
    if (mFlag == false) {
      task.execute();
      mBtn.setText(R.string.btn_cancel);
      mFlag = true;
    }
    else {
      task.cancel(false);
    }
  }

  @Override
  public void onTaskFinished() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "AsyncTaskが終了しました", Toast.LENGTH_LONG).show();
    mBtn.setText(R.string.btn_start);
    mFlag = false;
  }

  @Override
  public void onTaskCancelled() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "AsyncTaskがキャンセルされました", Toast.LENGTH_LONG).show();
    mBtn.setText(R.string.btn_start);
    mFlag = false;
  }
}
  • 動作例




コメントをかく


ユーザーIDでかく場合はこちら
「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます