戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

非同期処理:AsyncTask

AsyncTask はAndroidで用意された非同期処理に特化したスレッドクラスです。

API Reference: AsyncTask
ソフトウェア技術ドキュメントを勝手に翻訳 - 5. プロセスとスレッド スレッド

■ 注意事項 ---------------------------------------------------
AsyncTaskクラスは変数で保持せずに使い捨てしてください
 再利用した場合、 java.lang.IllegalStateException が発生します。
・AsyncTask#cancel() は呼んだだけでは AsyncTask#doInBackground() は終了しません。
 AsyncTask#cancel() を呼ぶと AsyncTask#isCancelled() が true を返すようになります。
 AsyncTask#doInBackground() 内で AsyncTask#isCancelled() を呼び出して終了してください。
 (サンプルは無くても終了する、というツッコミはなしでお願いします)
・AsyncTask#cancel() が呼ばれた時 AsyncTask#onPostExecute() は呼ばれません。
 代わりに AsyncTask#onCancelled() が呼ばれます。

以下のサンプルでキャンセルを行った場合、LogCatで警告メッセージ出ています。
原因はちょっと不明です…調べないと…

■ ソースコードで定義 -----------------------------------------
package jp.inujirushi.sample.activity;

import jp.inujirushi.sample.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class AsyncTaskActivity extends Activity {

/** アクティビティを生成したときに呼ばれます。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_dialog);

// ボタンのクリックイベントに非同期の開始処理を追加する
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// タスクを生成する
SampleAsyncTask mAsyncTask = new SampleAsyncTask();
// タスクを実行する
mAsyncTask.execute("非同期処理を開始します");
}
});
}

class SampleAsyncTask extends AsyncTask<String, Integer, String> {
/** プログレスダイアログ */
ProgressDialog mDialog;

/** 非同期実行前の処理を行います。 */
@Override
protected void onPreExecute() {
// ダイアログを作成する
mDialog = new ProgressDialog(AsyncTaskActivity.this);
mDialog.setTitle("非同期処理");
mDialog.setMessage("処理中...");
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.setMax(100);
mDialog.setProgress(0);
mDialog.setButton("キャンセル", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 非同期処理をキャンセルする
cancel(true);
}
});

// ダイアログを表示する
mDialog.show();
}

/** 非同期処理を行います */
@Override
protected String doInBackground(String... arg0) {
// 受け取ったパラメータをログに表示する
Log.d("execute()の引数", arg0[0]);

// 進捗率が100まで繰り返す
while (mDialog.getProgress() < 100) {
// 一定時間停止する
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// プログレスバーを更新する
publishProgress(mDialog.getProgress() + 1);

// キャンセルが押された場合
if (isCancelled()) {
// 処理を終了する
return null;
}
}

return "処理が正常に終了しました";
}

/** プログレスバーの更新を行います */
@Override
protected void onProgressUpdate(Integer... values) {
// 受け取った値をプログレスバーに反映する
mDialog.setProgress(values[0]);
}

/** 非同期実行後の処理を行います。 */
@Override
protected void onPostExecute(String result) {
// プログレスダイアログを閉じる
mDialog.dismiss();

// 受け取ったパラメータを通知メッセージで表示する
Toast.makeText(AsyncTaskActivity.this, result, Toast.LENGTH_SHORT)
.show();
}

/** 非同期キャンセル時の処理を行います */
@Override
protected void onCancelled() {
Toast.makeText(AsyncTaskActivity.this, "キャンセルされました",
Toast.LENGTH_SHORT).show();
}
}
}
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。