Android进步之路十:Handler修改UI界面之Demo

本文介绍了如何使用Handler在Android中实现线程间通信并更新UI界面。详细讲解了通过Handler将任务加入消息队列、在线程中进行操作、发送消息到主线程以及在主线程中处理消息并更新UI的过程,提供了三种不同场景的示例代码:Handler与Runnable、用Handler更新ProgressBar及Timer与Handler结合使用。
摘要由CSDN通过智能技术生成

先大致说下步骤:

1:点击按纽的时候,把线程加入消息对列

2:在线程中,做进度变化的操作

3:由handler向主线程发送修改UI界面的消息

4:由handler负责处理消息并修改UI界面


以下是我自己亲测的小demo

package com.example.handlerprogressbardemo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
/**
 * handler机制原理:
 * 	点击开始按纽的时候,1:把线程加入消息对列里面,2:在子线程 里面做一些进度变化的显示。3:通过handler向主线程发送消息,
 * 请求修改UI界面,4:由handler负责处理消息,最终来修改UI界面。
 * 
 *
 */
public class MainActivity extends Activity {
	private Handler handler;
	private Button mStartButton, mEndButton;
	private ProgressBar bar;
//	private Runnable updateBarThread;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initCom();
		
	}

	private void initCom() {
		
		bar = (ProgressBar) findViewById(R.id.progressBar);
		mStartButton = (Button) findViewById(R.id.button_start);
		mStartButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
//				第一次把线程加入消息对列
				handler.post(updateBarThread);
				
			}
		});
		
		handler = new Handler(){
			public void handleMessage(android.os.Message msg) {
//				handler更新UI
				bar.setProgress(msg.arg1);
				handler.post(updateBarThread);
				if(i>=100){
					bar.setProgress(0);
//					这里为什么要对i进行重新赋值啊,是因为,当进度大于100的时候,把进度条虽然清空了,但其实子线程还在
//					一直不停地走,而这时候i的值肯定是大于100的,所以会看不出效果,所以必须对i进行重新赋值,这样才会循
//					环操作
					i = 0;
				}
			};
		};
		
		mEndButton = (Button) findViewById(R.id.button_end);
		mEndButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				handler.removeCallbacks(updateBarThread);
			}
		});
	}
	
	
	private int i = 0;
	Runnable updateBarThread = new Runnable(){

//		int i = 0;
		int progress = 1;
		int count = 10;
		@Override
		public void run() {
//			i = i + 2;
			i = i + 100/10;
//			i = i + progress/count;
			Message msg = handler.obtainMessage();
//			用arg1提高性能
			msg.arg1 = i;
			handler.sendMessage(msg);
//			睡眠0.5秒
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(i>=100){
				
				handler.removeCallbacks(updateBarThread);
			}
		}
		
	};

}


下面是引用网络的小demo:

Handler与Runnable

[java]  view plain copy
  1. public class MainActivity extends Activity  
  2. {  
  3.     private Button mStartBtn,mEndBtn;  
  4.     private Handler mHandler;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.     {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.           
  11.         initCom();  
  12.     }   
  13.     private void initCom()  
  14.     {  
  15.           
  16.         mHandler = new Handler();  
  17.         mStartBtn = (Button)findViewById(R.id.button_start);  
  18.         mStartBtn.setOnClickListener(new OnClickListener()  
  19.         {  
  20.             @Override  
  21.             public void onClick(View v)  
  22.             {  
  23.                 //第一次加入消息队列  
  24.                 mHandler.post(r);  
  25.             }  
  26.         });  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值