Handler Message 消息机制和AsyncTask异步处理android数据交互

时间:2022-08-27 14:41:26

在手机客户端与服务器交互时,如果访问的数据量过大难免会出现等待时间,这期间引入ProgressDialog或其他加载进度显示界面将会是一个很友好的选择。通常我们选择android Handler消息机制解决ProgressDialog显示的问题。但是当我们从一个Activity跳到另一个Activity之间也有很大的数据加载等待,这种情况下使用AsyncTask将会是一个很很好的选择。本文将会以Handler Message机制和AsyncTask实现android异步数据处理。

原理:

用户触发Button或其他数据加载事件

产生数据加载,发送消息,通知加载对话框

这期间即初始化加载对话框

数据记载完成,发送消息通知关闭加载对话框

 

1)继承HandlerMyHandler类:

[java] view plain copy
  1. private class MyHandle extends Handler {  
  2.         @Override  
  3.         public void handleMessage(Message msg) {  
  4.             // TODO Auto-generated method stub  
  5.             super.handleMessage(msg);  
  6.             switch (msg.what) {  
  7.             case 0:  
  8.                 // 发送关闭对话框消息  
  9.                 Message close = new Message();  
  10.                 close.what = 1;  
  11.                 mHandler.sendMessage(close);  
  12.                 break;  
  13.             case 1:  
  14.                 if (pDialog != null) {  
  15.                     pDialog.dismiss();  
  16.                 }  
  17.                 break;  
  18.             default:  
  19.                 break;  
  20.             }  
  21.         }  
  22.     }  


 

 

 

2)加载对话框:

[java] view plain copy
  1. /** 
  2.      * @descript 初始化进度条对话框 
  3.      * @param 
  4.      * @rvoid 
  5.      */  
  6.     private void initPDialog() {  
  7.         // TODO Auto-generated method stub  
  8.         pDialog = new ProgressDialog(mContext);  
  9.         pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  10.         pDialog.setMessage("数据获取中。。。");  
  11.         pDialog.show();  
  12.     }  


 

3)实例化Handler

[java] view plain copy
  1. // 实例化Handler  
  2.             mHandler = new MyHandle();  


 

4)打开加载对话框消息发送

 

[java] view plain copy
  1. // 发送加载对话框消息  
  2.             Message open = new Message();  
  3.             open.what = 0;  
  4.             mHandler.sendMessage(open);  


l  AsyncTask实现

 

 

定义继承自AsyncTaskGetDataAsyncTask

[java] view plain copy
  1. public class GetDataAsyncTask extends AsyncTask<int[], Integer, int[]> {  
  2.   
  3.         public GetColorAsyncTask(Context context) {  
  4.             initDialog();// 初始化进度对话框  
  5.         }  
  6.   
  7.         /* 
  8.          * (non-Javadoc) 
  9.          *  
  10.          * @see android.os.AsyncTask#doInBackground(Params[]) 
  11.          */  
  12.         @Override  
  13.         protected int[] doInBackground(int[]... params) {  
  14.             // TODO Auto-generated method stub  
  15.             getData();// 耗时操作,AsyncTask处理你的数据逻辑  
  16.             return data;  
  17.         }  
  18.   
  19.         /* 
  20.          * (non-Javadoc) 
  21.          *  
  22.          * @see android.os.AsyncTask#onCancelled() 
  23.          */  
  24.         @Override  
  25.         protected void onCancelled() {  
  26.             // TODO Auto-generated method stub  
  27.             super.onCancelled();  
  28.         }  
  29.   
  30.         /* 
  31.          * (non-Javadoc) 
  32.          *  
  33.          * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
  34.          */  
  35.         @Override  
  36.         protected void onPostExecute(int[] result) {  
  37.             // TODO Auto-generated method stub  
  38.             super.onPostExecute(result);  
  39.             // 更新UI  
  40.           //…  your code here  
  41.          //…  
  42.             // 关闭进度窗口  
  43.             if (pDialog != null) {  
  44.                 pDialog.dismiss();  
  45.             }  
  46.         }  
  47.   
  48.         /* 
  49.          * (non-Javadoc) 
  50.          *  
  51.          * @see android.os.AsyncTask#onPreExecute() 
  52.          */  
  53.         @Override  
  54.         protected void onPreExecute() {  
  55.             // TODO Auto-generated method stub  
  56.             super.onPreExecute();  
  57.         }  
  58.   
  59.         /* 
  60.          * (non-Javadoc) 
  61.          *  
  62.          * @see android.os.AsyncTask#onProgressUpdate(Progress[]) 
  63.          */  
  64.         @Override  
  65.         protected void onProgressUpdate(Integer... values) {  
  66.             // TODO Auto-generated method stub  
  67.             super.onProgressUpdate(values);  
  68.         }  
  69.   
  70.     }  


2) 初始化加载对话框

[java] view plain copy
  1. /** 
  2.      * @descript 初始化进度条对话框 
  3.      * @param 
  4.      * @rvoid 
  5.      */  
  6.     private void initDialog() {  
  7.         // TODO Auto-generated method stub  
  8.         pDialog = new ProgressDialog(mContext);  
  9.         pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  10.         pDialog.setMessage("数据获取中。。。");  
  11.         pDialog.show();  
  12.     }  
  13.   
  14.   
  15.   
  16. 3)在Activity的主UI线程中实例化你的AsyncTask  
[java] view plain copy
  1.    
[java] view plain copy
  1. // AsyncTask code  
  2. GetDataAsyncTask task = new GetDataAsyncTask(mContext);  
  3. task.execute(data);  


 

注意事项

l  关闭与打开对话框语句不要写在Handler提交的自定义线程内,不然会出现对话框不关闭的情形。

l  对于AsyncTask实现中,doInBackground()方法中不能访问UI和更新UI。数据的访问与加载都在这个方法中实现;如果需要访问和更新UI需要在提交ResultonPostExecute()中实现;(the doInBackground is run in the background, and while you are inthe backgroud, you CAN NOT touch the UI. AdoInBackground operation should return a result, and that result will be passedto the onPostExecute. The onPostExecute is run on the UI thread and it is herethat you can update any UI elements, which includes setting a new list adapater.)。