Android入门(5)最简单的Handler例子

本文介绍了Android中的Handler机制,包括其基本概念、常用方法及如何在实际应用中使用它来更新UI线程。通过一个简单的进度条示例展示了如何在新线程中发送消息并由UI线程处理。

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

一、提要

昨天和今天都在看这个东西,关键是我Java的水平也就是Just soso,当时上课的时候线程和进程这方面并没有深入去学习,结果现在就悲剧了...

但经过将近两天的学习,还算有点起色。

下面是最简单的一个Handler实现,效果是点击startButton之后,不断更新进度条,满了 之后给出提示。



二、Handler简介

什么是Handler

handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过 handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这 个thread拥有UI线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发送数据,由UI线程 去更新界面。

Handler类的常用方法

方法签名

描述

public void handleMessage (Messagemsg)

子类对象通过该方法接收信息

public final boolean sendEmptyMessage (int what)

发送一个只含有what值的消息

public final boolean sendMessage (Messagemsg)

发送消息到Handler,

通过handleMessage方法接收

public final boolean hasMessages (int what)

监测消息队列中是否还

有what值的消息

public final boolean post (Runnabler)

将一个线程添加到消息队列

开发带有Handler类的程序步骤

在Activity或Activity的Widget中开发Handler类的对象,并重写handleMessage方法。

在新启动的线程中调用sendEmptyMessage或者sendMessage方法向Handler发送消息。

Handler类的对象用handleMessage方法接收消息,然后根据消息的不同执行不同的操作。


三、代码清单

package com.example.progressbar;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.view.View.OnClickListener;
public class ProgressBarHandle extends Activity {
	ProgressBar bar=null;
	Button startButton=null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progress_bar_handle);
        bar=(ProgressBar)findViewById(R.id.myProgressBar1);
        startButton=(Button)findViewById(R.id.myButton);
        startButton.setOnClickListener(new ButtonListener());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_progress_bar_handle, menu);
        return true;
    }
    class ButtonListener implements OnClickListener
    {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			bar.setVisibility(View.VISIBLE);
			updateBarHandler.post(updateThread);
		}
    	
    }
    Handler updateBarHandler=new Handler(){
    	@Override
    	public void handleMessage(Message msg)
    	{
    		bar.setProgress(msg.arg1);
    		updateBarHandler.post(updateThread);
    	}
    	
    };
    Runnable updateThread=new Runnable()
    {
    	int i=0;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("Begin Thread");
			i+=10;
			Message msg=updateBarHandler.obtainMessage();
			msg.arg1=i;
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e)
			{
			e.printStackTrace();	
			}
			updateBarHandler.sendMessage(msg);
			if(i==100)
				{
				updateBarHandler.removeCallbacks(updateThread);
				Toast.makeText(getApplicationContext(),    
	                    "Done!",   
	                    Toast.LENGTH_SHORT).show();   
				}
		}
    	
    };
    
}


一句话总结:handler对线程的处理并没有启动一个新的线程 ,而是直接在原有的线程上调用run函数.和new Thread(),然后start()概念完全不一样!

四、参考资料

Android developers:http://developer.android.com/training/basics/firstapp/running-app.html google的官方教程,非常推荐。

雷一的博客:http://www.cnblogs.com/rayee/tag/Android/ 素然只有四篇,但作为入门教程还是很不错的。

Android 开发教程:网上流传的教程,缺点是有点老。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值