Android入门:Handler简介与实例

转自:http://www.bdqn.cn/news/201303/8038.shtml

1、Handler简介

Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

发送、接受、处理消息–消息队列;

启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用Handler的post()方法和sendMessage()方法实现,分别对应功能:

post() 将一个线程加入线程队列;

sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

从消息队列中获取消息。

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

2、Handler实例

与ProgressBar结合的例子:

package mars.barhandler;    

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;    

public class TestBarHandler extends Activity {
        /** Called when the activity is first created. */
        //声明控件变量
        ProgressBar bar = null;
        Button startButton = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                //根据控件的ID得到代表控件的对象,并为按钮设置监听器
                bar = (ProgressBar)findViewById(R.id.bar);
                startButton = (Button)findViewById(R.id.startButton);
                startButton.setOnClickListener(new ButtonListener());
        }
        //当点击startButton按钮时,就会执行ButtonListener的onClick方法
        class ButtonListener implements OnClickListener{    

                public void onClick(View v) {
                        // TODO Auto-generated method stub
                        bar.setVisibility(View.VISIBLE);
                        updateBarHandler.post(updateThread);
                }    

        }
        //使用匿名内部类来复写Handler当中的handleMessage方法
        Handler updateBarHandler = new Handler(){    

                @Override
                public void handleMessage(Message msg) {
                        bar.setProgress(msg.arg1);
                        Bundle bundle = msg.getData();
                        updateBarHandler.post(updateThread);
                        System.out.println("test---->" + bundle.getString("test"));
                }    

        };
        //线程类,该类使用匿名内部类的方式进行声明
        Runnable updateThread = new Runnable(){
                int i = 0 ;
                public void run() {
                        System.out.println("Begin Thread" + i);
                        i = i + 10 ;
                        //得到一个消息对象,Message类是有Android操作系统提供
                        Message msg = updateBarHandler.obtainMessage();    

                        //将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
                        msg.arg1 = i ;
                        Bundle bundle = new Bundle();
                        bundle.putString("test", "test bundle");
                        msg.setData(bundle);
                        try {
                                //设置当前显示睡眠1秒
                                Thread.sleep(1000);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        //将msg对象加入到消息队列当中
                        if( i > 100){
                                //如果当i的值为100时,就将线程对象从handler当中移除
                                updateBarHandler.removeCallbacks(updateThread);
                                System.out.println(">>>>>>");
                        }else{
                                updateBarHandler.sendMessage(msg);
                                System.out.println("<<<<<<");
                        }
                }
        };
        class MyThread extends Thread{
                public void run(){    

                }
        }    

}

  

时间: 2024-10-25 05:02:16

Android入门:Handler简介与实例的相关文章

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

Android 中Message,MessageQueue,Looper,Handler详解+实例

一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue.其他非主线程,不会自动创建Looper,要需要的时候,通过调 用prepar

[Android]Message,MessageQueue,Looper,Handler详解+实例

转http://www.eoeandroid.com/forum-viewthread-tid-49595-highlight-looper.html 一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最多只可以拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自动创建其MessageQueue.通常使用一个Looper对象对该线程的MessageQueue进行管理.主线程创建时,会创建一 个默认的Loope

Android的Handler Looper Message机制应用实例与详解(一)

Android的UI操作不是线程安全的(出于提高性能考虑,避免实现多线程同步等机制所引入的延时),若多个线程同时对UI元素进行操作,可能导致线程安全问题.因此,Android中做了严格的规定:只有UI主线程才能对UI进行设置与操作. 在实际编程中,为了避免UI界面长时间得不到响应而导致的ANR(Application Not Responding)异常,通常将网络访问.复杂运算等一些耗时的操作被放在子线程中执行.这就需要子线程在运行完毕后将结果返回到主线程并通过UI进行显示.在Android中,

Android的Handler Looper Message机制应用实例与详解(二)

上一篇博文给出了Android中基于Handler Looper机制实现线程间通信的两个典型实例.本文将对该机制的基本原理进行较深入的研究.个人认为,学好Android编程最好的老师就是Android的源代码,下面将基于Android-19的源码进行分析,重点阐述分析思路. 要分析Handler Looper机制,自然想到去看Handler类和Looper类的源码(分别位于Handler.java和Looper.java两个文件中).简单阅读两个类的描述后,在Looper类的描述中能找到以下一段

Android精通教程-第一节Android入门简介

前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be life, and be without flavor. --- Eleanor Roosevelt 入门工具的安装 第一步:要下载的朋友注意了,先看完教程了解个大概,下载Android studio前,先安装jdk和IDE,Android SDK 第二步:下载jdk,提供JDK 9 地址: htt

Android中Handler的使用方法及实例(基础回顾)

Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该线程,每次线程的run函数中完成对界面输出nUpdateThread...文字,不停的运行下去,当单击End按钮时,该线程就会停止,如果继续单击Start,则文字又开始输出了. 软件界面如下: 实验主要部分代码和注释: MainActivity.java: 1 package com.ex

前端之Android入门(2) – 程序目录及UI简介

一,Android程序的目录结构 打开我们上次创建的HelloWorld项目,会看到一个目录结构,这就是Android的程序目录,这些目录的大致作用如下: src:源码的组织管理目录. gen:自动生成的目录,会生成一些重要的文件,如R.java,该目录一般不需要我们编写. assets:该目录文件不会被编译成二进制编码,多用于放音视频,文本等原始格式文件. bin:用于存放编译后的Java文件及apk文件. libs:存放Android的源码包或需要引入的源码包. res:程序资源的所在目录,

android handler runnable使用实例(关键是内部run中停止)

.java 1 package com.example.mydemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget