對AsyncTask進行封裝,簡化繁瑣的異步操作
對於android的異步操作,往往有二種方法給予我們選擇。
一:Thread+Handler
二: AsyncTask
對於二者的相同與異同點,這裏並不去進行比較。這裏提供一種簡化異步操作的方法,供大家參考學習。
代碼參考自AndEngine,不過我對它做了一定的修改,讓它更適合自己目前項目的開發,感謝open source 能夠讓我們去學習和閱讀那麼多優秀的代碼。
廢話不多說,代碼如下:
CallEarliest<T>:
- /**
- *
- * 回調接口,回調方法運行於主線程
- * @ClassName: CallEarliest
- * @author 薑濤
- * @version 1.0 2012-1-16 下午11:23:41
- * @param <T>
- */
- public interface CallEarliest<T> {
- public void onCallEarliest() throws Exception;
- }
Callable<T>:
/**
- * 回調接口,回調方法運行於異步線程
- * @ClassName: Callable
- * @author 薑濤
- * @version 1.0 2012-1-16 下午5:56:42
- * @param <T>
- */
- public interface Callable<T> {
- public T call() throws Exception;
- }
Callback<T>:
/**
- * 回調接口,回調方法運行於主線程
- * @ClassName: Callback
- * @author 薑濤
- * @version 1.0 2012-1-16 下午5:58:16
- * @param <T>
- */
- public interface Callback<T> {
- public void onCallback(final T pCallbackValue);
- }
IProgressListener:
/**
- * 觀察者
- * @ClassName: IProgressListener
- * @author 薑濤
- * @version 1.0 2012-1-16 下午11:08:40
- */
- ublic interface IProgressListener {
- /**
- * 進度發生改變的時候調用
- * @param pProgress
- */
- public void onProgressChanged(final int pProgress);
ProgressCallable<T>:
- /**
- * 被觀察者
- * @ClassName: ProgressCallable
- * @author 薑濤
- * @version 1.0 2012-1-16 下午11:08:52
- * @param <T>
- */
- public interface ProgressCallable<T> {
- /**
- * 注冊觀察者對象
- * @param pProgressListener
- * @return
- * @throws Exception
- */
- public T call(final IProgressListener pProgressListener) throws Exception;
- }
AsyncTaskUtils:
- /**
- * 異步操作工具類
- * @ClassName: ActivityUtils
- * @author 薑濤
- * @version 1.0 2012-1-16 下午11:02:26
- */
- public class AsyncTaskUtils {
- /**
- * 封裝的asynctask方法,此方法沒有進度框.
- *
- * @param pCallEarliest
- * 運行於主線程,最先執行此方法.
- * @param mCallable
- * 運行於異步線程,第二執行此方法.
- * @param mCallback
- * 運行於主線程,最後執行此方法.
- */
- public static <T> void doAsync(final CallEarliest<T> pCallEarliest,
- final Callable<T> pCallable, final Callback<T> pCallback) {
- new AsyncTask<Void, Void, T>() {
- /**
- * 首先運行此方法,運行於主線程
- */
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- try {
- pCallEarliest.onCallEarliest();
- } catch (Exception e) {
- Log.e("error", e.toString());
- }
- }
- /**
- * 第二步執行這個方法,這個方法運行在異步線程中
- */
- @Override
- protected T doInBackground(Void... params) {
- try {
- return pCallable.call();
- } catch (Exception e) {
- Log.e("error", e.toString());
- }
- return null;
- }
- /**
- * 第三步執行這個方法,運行於主線程
- */
- protected void onPostExecute(T result) {
- pCallback.onCallback(result);
- }
- }.execute((Void[]) null);
- }
- /**
- * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式.
- *
- * @param pContext
- * 上下文
- * @param styleID
- * 對話框樣式
- * ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER
- * @param pTitle
- * 標題
- * @param pMessage
- * 內容
- * @param pCallEarliest
- * 運行於主線程,最先執行此方法.
- * @param progressCallable
- * 運行於異步線程,用於傳遞對話框進度.
- * @param pCallback
- * 運行於主線程,最後執行此方法.
- */
- public static <T> void doProgressAsync(final Context pContext,
- final int styleID, final String pTitle, final String pMessage,
- final CallEarliest<T> pCallEarliest,
- final ProgressCallable<T> progressCallable,
- final Callback<T> pCallback) {
- new AsyncTask<Void, Void, T>() {
- private ProgressDialog mProgressDialog;
- /**
- * 首先運行此方法,運行於主線程
- */
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- mProgressDialog = new ProgressDialog(pContext);
- mProgressDialog.setProgressStyle(styleID);
- mProgressDialog.setTitle(pTitle);
- mProgressDialog.setMessage(pMessage);
- mProgressDialog.setIndeterminate(false);
- mProgressDialog.show();
- try {
- pCallEarliest.onCallEarliest();
- } catch (Exception e) {
- Log.e("error", e.toString());
- }
- }
- /**
- * 第二步執行這個方法,這個方法運行在異步線程中
- */
- @Override
- protected T doInBackground(Void... params) {
- try {
- return progressCallable.call(new IProgressListener() {
- @Override
- public void onProgressChanged(int pProgress) {
- // TODO Auto-generated method stub
- onProgressUpdate(pProgress);
- }
- });
- } catch (Exception e) {
- Log.e("error", e.toString());
- }
- return null;
- }
- /**
- * 更新進度框
- */
- protected void onProgressUpdate(final Integer... values) {
- mProgressDialog.setProgress(values[0]);
- };
- /**
- * 第三步執行這個方法,運行於主線程
- */
- protected void onPostExecute(T result) {
- if (mProgressDialog != null)
- mProgressDialog.dismiss();
- pCallback.onCallback(result);
- }
- }.execute((Void[]) null);
- }
- /**
- * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式.
- *
- * @param pContext
- * 上下文
- * @param styleID
- * 對話框樣式
- * ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER
- * @param pTitle
- * 標題,資源id
- * @param pMessage
- * 內容,資源id
- * @param pCallEarliest
- * 運行於主線程,最先執行此方法.
- * @param progressCallable
- * 運行於異步線程,用於傳遞對話框進度.
- * @param pCallback
- * 運行於主線程,最後執行此方法.
- */
- public static <T> void doProgressAsync(final Context pContext,
- final int styleID, final int pTitleResId, final int pMessageResId,
- final CallEarliest<T> pCallEarliest,
- final ProgressCallable<T> progressCallable,
- final Callback<T> pCallback) {
- AsyncTaskUtils.doProgressAsync(pContext, styleID,
- pContext.getString(pTitleResId),
- pContext.getString(pMessageResId), pCallEarliest,
- progressCallable, pCallback);
- }
- }
BaseActivity:
- /**
- * 公用Activity,用於存放與業務無關的公用方法
- *
- * @ClassName: BaseActivity
- * @author 薑濤
- * @version 1.0 2011-12-11 下午7:03:18
- */
- public abstract class BaseActivity extends Activity {
- /**
- * 封裝的asynctask方法,此方法沒有進度框.
- *
- * @param pCallEarliest 運行於主線程,最先執行此方法.
- * @param mCallable 運行於異步線程,第二執行此方法.
- * @param mCallback 運行於主線程,最後執行此方法.
- */
- public <T> void doAsync(final CallEarliest<T> pCallEarliest,
- final Callable<T> mCallable, final Callback<T> mCallback) {
- AsyncTaskUtils.doAsync(pCallEarliest, mCallable, mCallback);
- }
- /**
- * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式.
- * @param pContext 上下文
- * @param styleID 對話框樣式 ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER
- * @param pTitle 標題
- * @param pMessage 內容
- * @param pCallEarliest 運行於主線程,最先執行此方法.
- * @param progressCallable 運行於異步線程,用於傳遞對話框進度.
- * @param pCallback 運行於主線程,最後執行此方法.
- */
- public <T> void doProgressAsync(final Context pContext, final int styleID,
- final String pTitleResID, final String pMessageResID,
- final CallEarliest<T> pCallEarliest, final ProgressCallable<T> pCallable,
- final Callback<T> pCallback) {
- AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID,
- pMessageResID, pCallEarliest, pCallable, pCallback);
- }
- /**
- * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式.
- * @param pContext 上下文
- * @param styleID 對話框樣式 ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER
- * @param pTitle 標題,資源id
- * @param pMessage 內容,資源id
- * @param pCallEarliest 運行於主線程,最先執行此方法.
- * @param progressCallable 運行於異步線程,用於傳遞對話框進度.
- * @param pCallback 運行於主線程,最後執行此方法.
- */
- public <T> void doProgressAsync(final Context pContext, final int styleID,
- final int pTitleResID, final int pMessageResID,
- final CallEarliest<T> pCallEarliest, final ProgressCallable<T> pCallable,
- final Callback<T> pCallback) {
- AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID,
- pMessageResID, pCallEarliest, pCallable, pCallback);
- }
- }
SimpleAsyncTaskActivity:
- public class SimpleAsyncTaskActivity extends BaseActivity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.doProgressAsync(this, ProgressDialog.STYLE_HORIZONTAL,
- R.string.app_name, R.string.app_name, new CallEarliest<Void>() {
- @Override
- public void onCallEarliest() throws Exception {
- // TODO Auto-generated method stub
- }
- }, new ProgressCallable<Void>() {
- @Override
- public Void call(IProgressListener pProgressListener)
- throws Exception {
- // TODO Auto-generated method stub
- for (int i = 0; i < 100; i++) {
- Thread.sleep(200);
- pProgressListener.onProgressChanged(i);
- }
- return null;
- }
- }, new Callback<Void>() {
- @Override
- public void onCallback(Void pCallbackValue) {
- // TODO Auto-generated method stub
- }
- });
- }
- }
效果圖:
示例可參見附件.
- SimpleAsyncTask.zip (58.5 KB)
最後更新:2017-04-02 17:28:41