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

一、提要

昨天和今天都在看这个东西,关键是我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 开发教程:网上流传的教程,缺点是有点老。

你可能感兴趣的:(移动开发,ui,java)