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

概览

l  目的

l  实现

l  注意事项

 

目的

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

实现       

l  Handler Message 实现

 

原理:

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

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

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

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

 

1)继承HandlerMyHandler类:

private class MyHandle extends Handler {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			switch (msg.what) {
			case 0:
				// 发送关闭对话框消息
				Message close = new Message();
				close.what = 1;
				mHandler.sendMessage(close);
				break;
			case 1:
				if (pDialog != null) {
					pDialog.dismiss();
				}
				break;
			default:
				break;
			}
		}
	}


 

 

 

2)加载对话框:

/**
	 * @descript 初始化进度条对话框
	 * @param
	 * @rvoid
	 */
	private void initPDialog() {
		// TODO Auto-generated method stub
		pDialog = new ProgressDialog(mContext);
		pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		pDialog.setMessage("数据获取中。。。");
		pDialog.show();
	}


 

3)实例化Handler

// 实例化Handler
			mHandler = new MyHandle();


 

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

 

// 发送加载对话框消息
			Message open = new Message();
			open.what = 0;
			mHandler.sendMessage(open);


l  AsyncTask实现

 

 

1 定义继承自AsyncTaskGetDataAsyncTask

public class GetDataAsyncTask extends AsyncTask<int[], Integer, int[]> {

		public GetColorAsyncTask(Context context) {
			initDialog();// 初始化进度对话框
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#doInBackground(Params[])
		 */
		@Override
		protected int[] doInBackground(int[]... params) {
			// TODO Auto-generated method stub
			getData();// 耗时操作,AsyncTask处理你的数据逻辑
			return data;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onCancelled()
		 */
		@Override
		protected void onCancelled() {
			// TODO Auto-generated method stub
			super.onCancelled();
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */
		@Override
		protected void onPostExecute(int[] result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			// 更新UI
	      //…  your code here
         //…
			// 关闭进度窗口
			if (pDialog != null) {
				pDialog.dismiss();
			}
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onPreExecute()
		 */
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see android.os.AsyncTask#onProgressUpdate(Progress[])
		 */
		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
		}

	}


2) 初始化加载对话框

/**
	 * @descript 初始化进度条对话框
	 * @param
	 * @rvoid
	 */
	private void initDialog() {
		// TODO Auto-generated method stub
		pDialog = new ProgressDialog(mContext);
		pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		pDialog.setMessage("数据获取中。。。");
		pDialog.show();
	}



3)在Activity的主UI线程中实例化你的AsyncTask
 
		// AsyncTask code
		GetDataAsyncTask task = new GetDataAsyncTask(mContext);
		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.)。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值