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 开发教程:网上流传的教程,缺点是有点老。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中的Handler是用于在主线程(UI线程)与其他线程之间进行通信的机制。它允许你在后台线程中执行耗时的操作,并将结果传递回主线程更新UI。 下面是一个最简单的使用Handler的示例: ```java public class MainActivity extends AppCompatActivity { private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化Handler,关联到主线程的Looper mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { // 在主线程中处理消息 updateUI((String) msg.obj); } }; // 创建并启动后台线程 Thread backgroundThread = new Thread(new Runnable() { @Override public void run() { // 模拟耗时操作 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // 发送消息给主线程 Message message = mHandler.obtainMessage(); message.obj = "耗时操作完成"; mHandler.sendMessage(message); } }); backgroundThread.start(); } private void updateUI(String message) { // 更新UI TextView textView = findViewById(R.id.textView); textView.setText(message); } } ``` 这个例子中,我们在后台线程中模拟了一个耗时操作(这里用Thread.sleep模拟),然后通过Handler将结果传递给主线程更新UI。 在MainActivity的onCreate方法中,我们初始化了一个Handler,并重写了handleMessage方法,在这个方法中我们可以处理从后台线程发送过来的消息。在后台线程中,我们创建了一个Message对象,将结果存储在obj字段中,并通过Handler的sendMessage方法发送消息给主线程。 在主线程中,我们通过updateUI方法来更新UI,这里我们简单地将结果显示在一个TextView上。 需要注意的是,Handler的构造函数中传入了主线程的Looper对象,这样它就能够与主线程进行通信。另外,如果你在后台线程中创建Handler而没有传入Looper,那么Handler将与当前线程的Looper绑定,这样它就只能在当前线程中使用。 这只是一个简单例子,实际使用中你可能会遇到更复杂的场景,但是基本的原理和用法都是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值