package com.android_mvc.framework.task;
import java.util.HashMap;
import com.android_mvc.framework.annotations.SuppressDebugLog;
import com.android_mvc.framework.common.FWUtil;
import android.os.AsyncTask;
/**
* 逐次化可能な非同期タスクの基底クラス
* @author id:language_and_engineering
*
*/
@SuppressDebugLog(false)
abstract public class SequentialAsyncTask extends AsyncTask<Void, Void, Void> implements ISequentialRunnable
{
// TODO: APIレベル13以上(プラットフォームが3.2以上)だと,
// AsyncTask#executeの挙動が変わり,パラレルではなくシリアル実行になる。
// その差もいずれ吸収する必要がある。
// @see http://www.swingingblue.net/mt/archives/003629.html
// @see http://developer.android.com/intl/ja/guide/appendix/api-levels.html
// NOTE: AsyncTask自体はjava.util.concurrentのラッパーであり,
// UIにアクセスするために利用が必須。
// https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java
// 呼び出し元のランナー
protected AsyncTasksRunner parent = null;
// タスクの実行結果
private boolean task_execution_result = true;
// タスク内の保持データ
private HashMap<String, Object> hash = new HashMap<String, Object>();
// ランナー側にタスクの継続有無を通知するための定数
protected boolean CONTINUE_TASKS = true;
protected boolean BREAK_TASKS = false;
/**
* ランナーにより,このタスクを開始
*/
@Override
public void kickByRunner( AsyncTasksRunner parent )
{
// 呼び出し元のランナーをセット
this.parent = parent;
// タスクを開始
execute();
// onPreExecute, doInBackground, onPostExecuteの順に呼ばれる
FWUtil.d("別スレッドでのタスク実行を開始しました。");
}
// ------------- メイン処理 ------------
/**
* 個別タスクのメイン処理。
* 内部は単に逐次的に実行されるので,イベントなどの関係しない,いわゆる重い処理を詰め込むのに適している。
* 後続タスクへの継続是非を返す。
*/
protected abstract boolean main();
// NOTE: AsyncTaskの隠ぺいが主な仕事
/**
* 個別タスクの事前処理。
*/
protected void beforeExecution()
{
// Override me
}
/**
* タスク開始前
*/
@Override
protected void onPreExecute()
{
beforeExecution();
}
/**
* メイン処理を実行し,逐次タスクの進行是非を取得
*/
@Override
protected Void doInBackground(Void... unused)
{
// 重い処理を逐次的に実行
task_execution_result = main();
FWUtil.d("別スレッドでのタスク実行を終了しました。実行結果は" + task_execution_result);
return null;
}
@Override
protected void onPostExecute(Void unused)
{
// 呼び出し元に通知
parent.onCurrentTaskFinished();
}
// ------------- 下記はインタフェース宣言で共通のコード ------------
@Override
public boolean tasksContinuable()
{
return task_execution_result;
}
@Override
public void storeData( String key, Object val )
{
hash.put( key, val );
}
@Override
public HashMap<String, Object> getStoredObjects()
{
return hash;
}
@Override
public Object getDataFromRunner( String key )
{
return parent.getDataByKey( key );
}
}