对Handler的理解(一)--用handler处理进度条

本文深入探讨了如何使用Handler来处理Android应用中的进度条更新,通过实例讲解了具体的操作步骤和方法,帮助开发者更好地理解和应用Handler进行UI交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了下mars老师的视频,发现用handler处理进度条有两种方法,一种是纯粹的的通过调用post方法使进度条自增,另一种是通过发送message,然后通过handlemessage()方法来处处理信息,然后调用post(),在run()里面又发送mesage,如此实现循环。


第一种方法:

public class handler extends Activity{
	
	private Handler handler;
	private ProgressBar bar;
	private int i = 0;
	
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.handler);
		
		handler = new Handler();
		bar = (ProgressBar)findViewById(R.id.progressbar);
		//设置progressbar的最大值
		bar.setMax(150);
		//把线程加到线程队列中
		handler.post(runit);
	}
	
	Runnable runit = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			if (i==0) {
				bar.setVisibility(View.VISIBLE);
			}
			
			else if (i<bar.getMax()) {
				bar.setProgress(i);
				bar.setSecondaryProgress(i+10);
			}
			
			else {
				finish();
			}
			
			i = i+10;
			
			//相当于回调,再次把线程加到队列中,不过延迟500毫秒
			handler.postDelayed(runit, 500);
		}
		
		
	};
}


第二种方法:

public class handler2 extends Activity{
	
	private ProgressBar bar2;
	private Handler handler2;
	private int i = 0;
	private Message msg;
	
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.handler);
		
		bar2 = (ProgressBar)findViewById(R.id.progressbar);
		bar2.setVisibility(View.VISIBLE);
		
		handler2 = new Handler(){
			//通过handleMessage()方法来处理信息,同时把线程加到队列中
			public void handleMessage(Message msg) {
				bar2.setProgress(msg.arg1);
				handler2.post(runit2);
			}
		};
		
		//把一个线程加到队列中去,循环的开头
		handler2.post(runit2);
	}
		
		Runnable runit2 = new Runnable() {
			
			public void run() {
				// TODO Auto-generated method stub
				i = i+10;
				msg = handler2.obtainMessage();//???
				msg.arg1 = i;
				
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				//在线程中发送信息,实现循环
				handler2.sendMessage(msg);
				if (i == 100) {
					finish();
				}
			}
		};
	}
	

这里我又一个不明白的地方:
msg = handler2.obtainMessage();//???
这里为什么不new一个message的实例?查了API,上面说这个方法默认设置了Message.target == this,这是什么意思???希望高手解答!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值