閱讀553 返回首頁    go 阿裏雲 go 技術社區[雲棲]


對AsyncTask進行封裝,簡化繁瑣的異步操作

對於android的異步操作,往往有二種方法給予我們選擇。

     一:Thread+Handler

     二:  AsyncTask

 

     對於二者的相同與異同點,這裏並不去進行比較。這裏提供一種簡化異步操作的方法,供大家參考學習。   

     代碼參考自AndEngine,不過我對它做了一定的修改,讓它更適合自己目前項目的開發,感謝open source 能夠讓我們去學習和閱讀那麼多優秀的代碼。

 

     廢話不多說,代碼如下:

 

     CallEarliest<T>:

 

Java代碼  收藏代碼
  1. /** 
  2.  *  
  3.  * 回調接口,回調方法運行於主線程 
  4.  * @ClassName: CallEarliest    
  5.  * @author 薑濤 
  6.  * @version 1.0 2012-1-16 下午11:23:41    
  7.  * @param <T> 
  8.  */  
  9. public interface CallEarliest<T> {  
  10.       
  11.     public void onCallEarliest() throws Exception;  
  12. }  
 

    Callable<T>:

    /**

Java代碼  收藏代碼
  1.  * 回調接口,回調方法運行於異步線程  
  2.  * @ClassName: Callable     
  3.  * @author 薑濤  
  4.  * @version 1.0 2012-1-16 下午5:56:42     
  5.  * @param <T>  
  6.  */  
  7. public interface Callable<T> {  
  8.       
  9.     public T call() throws Exception;  
  10. }  

 

   Callback<T>:

   /**

Java代碼  收藏代碼
  1.  * 回調接口,回調方法運行於主線程  
  2.  * @ClassName: Callback     
  3.  * @author 薑濤  
  4.  * @version 1.0 2012-1-16 下午5:58:16     
  5.  * @param <T>  
  6.  */  
  7. public interface Callback<T> {  
  8.       
  9.     public void onCallback(final T pCallbackValue);  
  10. }  

 

   IProgressListener:

 

   /**

Java代碼  收藏代碼
  1. * 觀察者  
  2. @ClassName: IProgressListener     
  3. @author 薑濤  
  4. @version 1.0 2012-1-16 下午11:08:40  
  5. */  
  6. ublic interface IProgressListener {  
  7.   
  8. /** 
  9.  * 進度發生改變的時候調用 
  10.  * @param pProgress 
  11.  */  
  12. public void onProgressChanged(final int pProgress);  
 

    ProgressCallable<T>:

 

 

Java代碼  收藏代碼
  1. /** 
  2.  * 被觀察者 
  3.  * @ClassName: ProgressCallable 
  4.  * @author 薑濤 
  5.  * @version 1.0 2012-1-16 下午11:08:52 
  6.  * @param <T> 
  7.  */  
  8. public interface ProgressCallable<T> {  
  9.   
  10.     /** 
  11.      * 注冊觀察者對象 
  12.      * @param pProgressListener 
  13.      * @return 
  14.      * @throws Exception 
  15.      */  
  16.     public T call(final IProgressListener pProgressListener) throws Exception;  
  17. }  
 

 

    AsyncTaskUtils:

 

Java代碼  收藏代碼
  1. /** 
  2.  * 異步操作工具類 
  3.  * @ClassName: ActivityUtils 
  4.  * @author 薑濤 
  5.  * @version 1.0 2012-1-16 下午11:02:26 
  6.  */  
  7. public class AsyncTaskUtils {  
  8.   
  9.     /** 
  10.      * 封裝的asynctask方法,此方法沒有進度框. 
  11.      *  
  12.      * @param pCallEarliest 
  13.      *            運行於主線程,最先執行此方法. 
  14.      * @param mCallable 
  15.      *            運行於異步線程,第二執行此方法. 
  16.      * @param mCallback 
  17.      *            運行於主線程,最後執行此方法. 
  18.      */  
  19.     public static <T> void doAsync(final CallEarliest<T> pCallEarliest,  
  20.             final Callable<T> pCallable, final Callback<T> pCallback) {  
  21.   
  22.         new AsyncTask<Void, Void, T>() {  
  23.   
  24.             /** 
  25.              * 首先運行此方法,運行於主線程 
  26.              */  
  27.             @Override  
  28.             protected void onPreExecute() {  
  29.                 super.onPreExecute();  
  30.                 try {  
  31.                     pCallEarliest.onCallEarliest();  
  32.                 } catch (Exception e) {  
  33.                     Log.e("error", e.toString());  
  34.                 }  
  35.             }  
  36.   
  37.             /** 
  38.              * 第二步執行這個方法,這個方法運行在異步線程中 
  39.              */  
  40.             @Override  
  41.             protected T doInBackground(Void... params) {  
  42.   
  43.                 try {  
  44.                     return pCallable.call();  
  45.                 } catch (Exception e) {  
  46.                     Log.e("error", e.toString());  
  47.                 }  
  48.                 return null;  
  49.             }  
  50.   
  51.             /** 
  52.              * 第三步執行這個方法,運行於主線程 
  53.              */  
  54.             protected void onPostExecute(T result) {  
  55.                 pCallback.onCallback(result);  
  56.             }  
  57.         }.execute((Void[]) null);  
  58.     }  
  59.   
  60.     /** 
  61.      * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式. 
  62.      *  
  63.      * @param pContext 
  64.      *            上下文 
  65.      * @param styleID 
  66.      *            對話框樣式 
  67.      *            ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER 
  68.      * @param pTitle 
  69.      *            標題 
  70.      * @param pMessage 
  71.      *            內容 
  72.      * @param pCallEarliest 
  73.      *            運行於主線程,最先執行此方法. 
  74.      * @param progressCallable 
  75.      *            運行於異步線程,用於傳遞對話框進度. 
  76.      * @param pCallback 
  77.      *            運行於主線程,最後執行此方法. 
  78.      */  
  79.     public static <T> void doProgressAsync(final Context pContext,  
  80.             final int styleID, final String pTitle, final String pMessage,  
  81.             final CallEarliest<T> pCallEarliest,  
  82.             final ProgressCallable<T> progressCallable,  
  83.             final Callback<T> pCallback) {  
  84.   
  85.         new AsyncTask<Void, Void, T>() {  
  86.   
  87.             private ProgressDialog mProgressDialog;  
  88.   
  89.             /** 
  90.              * 首先運行此方法,運行於主線程 
  91.              */  
  92.             @Override  
  93.             protected void onPreExecute() {  
  94.                 super.onPreExecute();  
  95.   
  96.                 mProgressDialog = new ProgressDialog(pContext);  
  97.                 mProgressDialog.setProgressStyle(styleID);  
  98.                 mProgressDialog.setTitle(pTitle);  
  99.                 mProgressDialog.setMessage(pMessage);  
  100.                 mProgressDialog.setIndeterminate(false);  
  101.                 mProgressDialog.show();  
  102.                 try {  
  103.                     pCallEarliest.onCallEarliest();  
  104.                 } catch (Exception e) {  
  105.                     Log.e("error", e.toString());  
  106.                 }  
  107.             }  
  108.   
  109.             /** 
  110.              * 第二步執行這個方法,這個方法運行在異步線程中 
  111.              */  
  112.             @Override  
  113.             protected T doInBackground(Void... params) {  
  114.                 try {  
  115.                     return progressCallable.call(new IProgressListener() {  
  116.   
  117.                         @Override  
  118.                         public void onProgressChanged(int pProgress) {  
  119.                             // TODO Auto-generated method stub  
  120.                             onProgressUpdate(pProgress);  
  121.                         }  
  122.                     });  
  123.                 } catch (Exception e) {  
  124.                     Log.e("error", e.toString());  
  125.                 }  
  126.   
  127.                 return null;  
  128.             }  
  129.   
  130.             /** 
  131.              * 更新進度框 
  132.              */  
  133.             protected void onProgressUpdate(final Integer... values) {  
  134.                 mProgressDialog.setProgress(values[0]);  
  135.             };  
  136.   
  137.             /** 
  138.              * 第三步執行這個方法,運行於主線程 
  139.              */  
  140.             protected void onPostExecute(T result) {  
  141.                 if (mProgressDialog != null)  
  142.                     mProgressDialog.dismiss();  
  143.                 pCallback.onCallback(result);  
  144.   
  145.             }  
  146.   
  147.         }.execute((Void[]) null);  
  148.   
  149.     }  
  150.   
  151.     /** 
  152.      * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式. 
  153.      *  
  154.      * @param pContext 
  155.      *            上下文 
  156.      * @param styleID 
  157.      *            對話框樣式 
  158.      *            ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER 
  159.      * @param pTitle 
  160.      *            標題,資源id 
  161.      * @param pMessage 
  162.      *            內容,資源id 
  163.      * @param pCallEarliest 
  164.      *            運行於主線程,最先執行此方法. 
  165.      * @param progressCallable 
  166.      *            運行於異步線程,用於傳遞對話框進度. 
  167.      * @param pCallback 
  168.      *            運行於主線程,最後執行此方法. 
  169.      */  
  170.     public static <T> void doProgressAsync(final Context pContext,  
  171.             final int styleID, final int pTitleResId, final int pMessageResId,  
  172.             final CallEarliest<T> pCallEarliest,  
  173.             final ProgressCallable<T> progressCallable,  
  174.             final Callback<T> pCallback) {  
  175.         AsyncTaskUtils.doProgressAsync(pContext, styleID,  
  176.                 pContext.getString(pTitleResId),  
  177.                 pContext.getString(pMessageResId), pCallEarliest,  
  178.                 progressCallable, pCallback);  
  179.     }  
  180.   
  181. }  
 

 

 

     BaseActivity:

 

 

Java代碼  收藏代碼
  1. /** 
  2.  * 公用Activity,用於存放與業務無關的公用方法 
  3.  *  
  4.  * @ClassName: BaseActivity 
  5.  * @author 薑濤 
  6.  * @version 1.0 2011-12-11 下午7:03:18 
  7.  */  
  8. public abstract class BaseActivity extends Activity {  
  9.   
  10.     /** 
  11.      * 封裝的asynctask方法,此方法沒有進度框. 
  12.      *  
  13.      * @param pCallEarliest 運行於主線程,最先執行此方法. 
  14.      * @param mCallable 運行於異步線程,第二執行此方法. 
  15.      * @param mCallback 運行於主線程,最後執行此方法. 
  16.      */  
  17.     public <T> void doAsync(final CallEarliest<T> pCallEarliest,  
  18.             final Callable<T> mCallable, final Callback<T> mCallback) {  
  19.         AsyncTaskUtils.doAsync(pCallEarliest, mCallable, mCallback);  
  20.     }  
  21.   
  22.     /** 
  23.      * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式. 
  24.      * @param pContext  上下文 
  25.      * @param styleID   對話框樣式 ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER 
  26.      * @param pTitle    標題 
  27.      * @param pMessage  內容 
  28.      * @param pCallEarliest  運行於主線程,最先執行此方法. 
  29.      * @param progressCallable 運行於異步線程,用於傳遞對話框進度. 
  30.      * @param pCallback  運行於主線程,最後執行此方法. 
  31.      */  
  32.     public <T> void doProgressAsync(final Context pContext, final int styleID,  
  33.             final String pTitleResID, final String pMessageResID,  
  34.             final CallEarliest<T> pCallEarliest, final ProgressCallable<T> pCallable,  
  35.             final Callback<T> pCallback) {  
  36.   
  37.         AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID,  
  38.                 pMessageResID, pCallEarliest, pCallable, pCallback);  
  39.     }  
  40.       
  41.       
  42.     /** 
  43.      * 封裝的asynctask方法,此方法擁有進度對話框,並支持定義樣式. 
  44.      * @param pContext  上下文 
  45.      * @param styleID   對話框樣式 ProgressDialog.STYLE_HORIZONTAL|ProgressDialog.STYLE_SPINNER 
  46.      * @param pTitle    標題,資源id 
  47.      * @param pMessage  內容,資源id 
  48.      * @param pCallEarliest  運行於主線程,最先執行此方法. 
  49.      * @param progressCallable 運行於異步線程,用於傳遞對話框進度. 
  50.      * @param pCallback  運行於主線程,最後執行此方法. 
  51.      */  
  52.     public <T> void doProgressAsync(final Context pContext, final int styleID,  
  53.             final int pTitleResID, final int pMessageResID,  
  54.             final CallEarliest<T> pCallEarliest, final ProgressCallable<T> pCallable,  
  55.             final Callback<T> pCallback) {  
  56.   
  57.         AsyncTaskUtils.doProgressAsync(pContext, styleID, pTitleResID,  
  58.                 pMessageResID, pCallEarliest, pCallable, pCallback);  
  59.     }  
  60.   
  61.       
  62. }  
 

    SimpleAsyncTaskActivity:

 

 

Java代碼  收藏代碼
  1. public class SimpleAsyncTaskActivity extends BaseActivity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.         this.doProgressAsync(this, ProgressDialog.STYLE_HORIZONTAL,  
  8.                 R.string.app_name, R.string.app_name, new CallEarliest<Void>() {  
  9.   
  10.                     @Override  
  11.                     public void onCallEarliest() throws Exception {  
  12.                         // TODO Auto-generated method stub  
  13.   
  14.                     }  
  15.   
  16.                 }, new ProgressCallable<Void>() {  
  17.   
  18.                     @Override  
  19.                     public Void call(IProgressListener pProgressListener)  
  20.                             throws Exception {  
  21.                         // TODO Auto-generated method stub  
  22.                         for (int i = 0; i < 100; i++) {  
  23.                             Thread.sleep(200);  
  24.                             pProgressListener.onProgressChanged(i);  
  25.                         }  
  26.                         return null;  
  27.                     }  
  28.   
  29.                 }, new Callback<Void>() {  
  30.   
  31.                     @Override  
  32.                     public void onCallback(Void pCallbackValue) {  
  33.                         // TODO Auto-generated method stub  
  34.   
  35.                     }  
  36.                 });  
  37.     }  
  38. }  
 

 

    效果圖:

 


 

 

 

   示例可參見附件.

 

最後更新:2017-04-02 17:28:41

  上一篇:go bwm-tools compile error resolve.
  下一篇:go Android自定義捕獲Application全局異常優化版