最終更新:
moonlight_aska 2014年09月29日(月) 00:19:16履歴
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;
}
}
- 動作例

コメントをかく