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

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

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

先大致说下步骤:

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.         });  
  27.           
  28.         mEndBtn = (Button)findViewById(R.id.button_end);  
  29.         mEndBtn.setOnClickListener(new OnClickListener()  
  30.         {  
  31.             @Override  
  32.             public void onClick(View v)  
  33.             {  
  34.                 mHandler.removeCallbacks(r);  
  35.             }  
  36.         });  
  37.     }  
  38.       
  39.     Runnable r = new Runnable()  
  40.     {  
  41.         @Override  
  42.         public void run()  
  43.         {  
  44.             //要这些的操作,写在run()方法内部  
  45.             Log.e("-------""------------");  
  46.             mHandler.postDelayed(r, 1000);  
  47.         }  
  48.     };  
  49. }  


用Handler更新UI

[java]  view plain copy
  1. public class MainActivity extends Activity  
  2. {  
  3.     private Button mStartBtn;  
  4.     private ProgressBar bar;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.   
  12.         initCom();  
  13.     }  
  14.   
  15.     private void initCom()  
  16.     {  
  17.   
  18.         bar = (ProgressBar)findViewById(R.id.progressBar1);  
  19.         mStartBtn = (Button) findViewById(R.id.button_start);  
  20.         mStartBtn.setOnClickListener(new OnClickListener()  
  21.         {  
  22.             @Override  
  23.             public void onClick(View v)  
  24.             {  
  25.                 // 第一次把线程加入消息队列  
  26.                 handler.post(updateBarThread);  
  27.             }  
  28.         });  
  29.     }  
  30.   
  31.     Handler handler = new Handler()  
  32.     {  
  33.         public void handleMessage(android.os.Message msg)  
  34.         {  
  35.             //handler更新UI  
  36.             bar.setProgress(msg.arg1);  
  37.             handler.post(updateBarThread);  
  38.         };  
  39.     };  
  40.   
  41.     Runnable updateBarThread = new Runnable()  
  42.     {  
  43.         int i = 0;  
  44.         @Override  
  45.         public void run()  
  46.         {  
  47.             i = i + 10;  
  48.             Message msg = handler.obtainMessage();  
  49.             msg.arg1 = i;//用arg1,提高性能  
  50.             handler.sendMessage(msg );  
  51.             //睡眠1秒  
  52.             try  
  53.             {  
  54.                 Thread.sleep(1000);  
  55.             }  
  56.             catch (InterruptedException e)  
  57.             {  
  58.                 e.printStackTrace();  
  59.             }  
  60.             if (i == 100)  
  61.             {  
  62.                 handler.removeCallbacks(updateBarThread);  
  63.             }  
  64.               
  65.         }  
  66.     };  
  67. }  

xml中进度条:

[html]  view plain copy
  1. <ProgressBar  
  2.         android:id="@+id/progressBar1"  
  3.         style="@android:style/Widget.ProgressBar.Horizontal"  
  4.         android:layout_width="fill_parent"  
  5.         android:layout_height="wrap_content" />  

Timer与Handler:

[java]  view plain copy
  1. public class MainActivity extends Activity  
  2. {  
  3.     protected static final int NUM_1 = 1;  
  4.     private TextView textView;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.   
  12.         initCom();  
  13.     }  
  14.   
  15.     private void initCom()  
  16.     {  
  17.         textView = (TextView) findViewById(R.id.textView);  
  18.   
  19.         Timer timer = new Timer();  
  20.         timer.schedule(new TimerTask()  
  21.         {  
  22.             @Override  
  23.             public void run()  
  24.             {  
  25.                 Message msg = new Message();  
  26.                 msg.arg1 = 1;  
  27.                 handler.sendMessage(msg);  
  28.             }  
  29.         }, 2000);  
  30.     }  
  31.   
  32.     Handler handler = new Handler()  
  33.     {  
  34.         public void handleMessage(android.os.Message msg)  
  35.         {  
  36.             // handler更新UI  
  37.             switch (msg.arg1)  
  38.             {  
  39.             case NUM_1:  
  40.                 textView.setText("test");  
  41.                 break;  
  42.             default:  
  43.                 break;  
  44.             }  
  45.         };  
  46.     };  
  47. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值