package org.android.textbook4.asynctasksample;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
public class ImageLoadAsyncTask extends
AsyncTask<String, Integer, List<Bitmap>> {
private Context mContext;
private ImageLoadAsyncTaskListener mListener;
/**
* UIスレッドに通知するためのインターフェイス
*
* @note
*/
public interface ImageLoadAsyncTaskListener {
/** タスク実行前 */
public void onStartBackgroundTask();
/** タスクの進捗状況を通知します */
public void onProgressUpdate(int progress);
/** タスク結果を渡します */
public void onEndBackgroundTask(List<Bitmap> result);
/** タスクをキャンセルした */
public void onCancelledTask();
}
/**
* コンストラクタ
*
* @param コンテキスト
* @param UIスレッドに通知を行うリスナー
*/
public ImageLoadAsyncTask(Context context,
ImageLoadAsyncTaskListener listener) {
mContext = context;
mListener = listener;
}
/**
* バックグラウンド処理
*
* @param ファイルパス
* @note バックグラウンドのスレッドで実行されます
*/
@Override
protected List<Bitmap> doInBackground(String... files) {
List<Bitmap> bitmaps = new ArrayList<Bitmap>();
// assetsからファイルをreadする
for (int i = 0; i < files.length; i++) {
if (isCancelled()) {
// タスクのキャンセル
break;
}
try {
InputStream inputStream = mContext.getAssets().open(files[i]);
Bitmap bmp = BitmapFactory.decodeStream(inputStream);
bitmaps.add(bmp);
// UIスレッドに進捗状況を通知
publishProgress(i + 1);
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmaps;
}
/**
* タスク開始前処理
*
* @note UIスレッド上で実行します
*/
@Override
protected void onPreExecute() {
mListener.onStartBackgroundTask();
}
/**
* 進捗更新
*
* @note UIスレッド上で実行します
*/
@Override
protected void onProgressUpdate(Integer... values) {
mListener.onProgressUpdate(values[0]);
}
/**
* タスク終了処理
*
* @note UIスレッド上で実行します
*/
@Override
protected void onPostExecute(List<Bitmap> result) {
// タスクが終了したことをUIスレッドに通知
mListener.onEndBackgroundTask(result);
}
/**
* キャンセル処理
*
*/
@Override
protected void onCancelled() {
// UIスレッドに通知
mListener.onCancelledTask();
}
}