Android之Handler异步处理数据

这里展示一个Demo,具体实现了一个ProgressBar通过新建的线程完成一系列的操作,并实时更新UI界面。

package com.example.handler;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
	private ProgressBar progressBar;
	private final int MESSAGE_0 = 1;
	public int prog;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Log.i("handler", "MainActivity Thread id = " + Thread.currentThread().getId());
		setView();
		/*当使用
		  handler.post(new Runnable);
		    时Handler和Activity处于同一个线程当中,在同一个线程中调用run方法。
		    使用Handler的post方法将Runnable对象放到Handler的线程队列中后,该Runnable的执行其实并未单独开启线程,
		    而是仍然在当前Activity线程中执行的,Handler只是调用了Runnable对象的run方法。
		    
		    而使用
		  Thread t = new Thread(new Runnable());
		  t.start();
		    创建的线程和Activity处于不同的线程中*/
		new Thread(new MyThread()).start();
	}
	
	private void setView() {
		// TODO Auto-generated method stub
		progressBar = (ProgressBar)findViewById(R.id.progressBar1);
		progressBar.setMax(100);
		
	}
	
	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			int what = msg.what;
			switch (what) {
			case MESSAGE_0:
				prog = msg.arg1;
				progressBar.setProgress(prog + 1);
				break;

			default:
				break;
			}
		};
	};

	public class MyThread implements Runnable{
		//在新线程中处理数据,并把数据包装成Message发送给主线程的handler做UI处理等

		@Override
		public void run() {
			// 
			Log.i("handler", "MyThread id = " + Thread.currentThread().getId());
			for(int i=0;i<100;i++){
				/*
				 * 用obtainMessage获取的Message开销要比每次创建一个Msg对象要小
				 * 此方法是从Message Pool中提取的,省略了New一个Message的开销
				 * 尤其是在这种循环之中
				 */
				Message message = handler.obtainMessage();
				message.arg1 = i;
				message.what = MESSAGE_0;
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				handler.sendMessage(message);
			}
		}
		
	}
}
代码中的大部分要点已经注释出来了,不再需要过多的解释了,请大家细细体会。

此Demo可以作为Handler异步消息处理并更新UI界面的模板。

这篇文章实现了Thread向主UI线程发送消息(sendMessage),消息的处理(handlerMessage)依然是在主UI线程中。下一章会实现一个绑定新Looper的Handler,并在新进程中处理发送过来的数据(handlerMessage)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值