最終更新:
moonlight_aska 2014年09月28日(日) 17:17:20履歴
比較的重い処理(画像処理, DBアクセス, HTTPダウンロード等)をUIスレッドに負荷を与えずバックグラウンドで処理したい場合, AsyncTaskクラスを利用する.
他にも「IntentServiceで非同期処理を行う」でも実現できる.
型1 ... AsyncTask#executeメソッドの引数の型 / AsyncTask#doInBackgroundメソッドの引数の型
型2 ... AsyncTask#onProgressUpdateメソッドの引数の型
型3 ... AsyncTask#doInBackgroundメソッドの戻り値の型 / AsyncTask#onPostExecuteメソッドの引数の型
他にも「IntentServiceで非同期処理を行う」でも実現できる.
- MainActivity.java
- AsyncTaskのサブクラスのインスタンスを生成する.
- AsyncTask#executeメソッドで, 非同期(スレッド)処理を実行する.
- AsyncTaskサブクラスを実装する.
型1 ... AsyncTask#executeメソッドの引数の型 / AsyncTask#doInBackgroundメソッドの引数の型
型2 ... AsyncTask#onProgressUpdateメソッドの引数の型
型3 ... AsyncTask#doInBackgroundメソッドの戻り値の型 / AsyncTask#onPostExecuteメソッドの引数の型
- AsyncTaskのサブクラスのコンストラクタを必要に応じて実装する.
- AsyncTask#onPreExecuteメソッドを必要に応じて実装する. バックグラウンド処理の実行前に実行される.
- AsyncTask#onPostExecuteメソッドを必要に応じて実装する. バックグラウンド処理完了後に実行される.
- AsyncTask#doInBackgroundメソッドに, バックグラウンド処理の内容を実装する.
package com.moonlight_aska.android.asynctask01;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnStart = (Button)findViewById(R.id.btn_id);
// Buttonのイベントハンドラ
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SampleAsyncTask task = new SampleAsyncTask();
// 非同期処理の開始
task.execute();
}
});
}
// AsyncTaskのサブクラス
private class SampleAsyncTask extends AsyncTask<Void, Long, Long> {
TextView mText;
Button mBtn;
Long mSec;
// コンストラクタ
public SampleAsyncTask() {
mText = (TextView)findViewById(R.id.text_id);
mBtn = (Button)findViewById(R.id.btn_id);
}
// バックグラウンド処理の前に実行される処理
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
Log.v("AsyncTask", "onPreExecute");
mBtn.setEnabled(false);
mSec = 0L;
}
// バックグラウンド処理完了後に実行される処理
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
Log.v("AsyncTask", "onPostExecute");
mBtn.setEnabled(true);
}
// バックグラウンド処理
@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");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mSec;
}
}
}
- 実行例

コメントをかく