Android消息机制--Handler的常见用法介绍

Handler_0">1、Handler的诞生背景

在Android中,规定了只能在主线程(或者叫UI线程)中,去进行UI相关的操作,而其他线程则无法操作UI,否则报错;
但同时,由于不能再UI线程进行耗时的操作,否则会报ANR异常, 因此,我们通常又把耗时操作放到子线程去进行一个处理。
那这就涉及到了一个数据传递的问题,我们在子线程处理的数据,怎么传递到主线程呢?这就有了Handler消息机制。

HandlerMessageQueueLooper_6">2、Handler、MessageQueue、Looper的作用简介

我们可以通过Handler对象发送消息到主线程进行处理。 至于为什么通过handler就可在主线程处理,原因及源码的分析见下一篇Android消息机制详解,这里先简单做一个介绍。

Handler消息机制主要由Handler、MessageQueue、Looper三个部分组成。通过Handler发送消息到主线程的MessageQueue这个消息队列进行存储,其中MessageQueue是一个单链表结构,然后由Looper轮询器依次从MessageQueue取出数据,在主线程进行处理,其中Looper是一个死循环。

Handler_13">3、用Handler处理耗时操作

Handler最常见的用法就是处理耗时任务,此种情况通常报随着子线程,通常是在子线程把耗时任务处理完以后,再通过Handler回调到主线程进行处理:

public class HandlerTestActivity extends Activity {

    private static Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //此方法处理handler对象在其他位置或线程发送过来的消息
			//此方法是在主线程被中调用,
            switch (msg.arg1) {
                case 1:
                    //此处做逻辑处理,如更新UI
                default:

            }
        }
    };

    private void dealLongTimeTask() {
        //新开线程
        new Thread(){
            @Override
            public void run() {
                super.run();
                //在这个子线程先执行耗时操作,然后通过handler将执行完的数据传递到主线程
                Message msg = Message.obtain();
                //msg提供了一些属性和方法来传递数据,可以根据自己的需求选择其中一些来传值;
                msg.arg1 = 1;//随便设置几个值
                msg.arg2 = 2;
                msg.obj = new String("test");
                mHandler.sendMessage(msg);
            }
        }.start();
    }
...
}

HandlerpostDelayed_53">4、用Handler.postDelayed处理定时任务

可以直接使用postDelayed将我们的任务延时处理,但是在run方法中也不能继续耗时操作,因为run方法也是运行在主线程的,只要有耗时操作,都应该在子线程处理,处理完得到数据后,再通过handler或者接口回调等,把数据传递给主线程处理;

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
		//此处执行我们的任务, 但是不建议执行耗时任务
		//因为run方法在主线程被执行;
		//可以把耗时操作得到的数据,在此处进行处理
        }
    }, 1000);

Handlerpost_67">5、用Handler.post处理普通任务

使用Handler.post方法,run方法会直接在主线程进行执行。

    mHandler.post(new Runnable() {
        @Override
        public void run() {
		//此处执行我们的任务, 但是不建议执行耗时任务
		//因为run方法在主线程被执行;
		//可以把耗时操作得到的数据,在此处进行处理
        }
    });

http://www.niftyadmin.cn/n/1541311.html

相关文章

Android消息机制详解:Handler、MessageQueue、Looper

1、Handler的诞生背景 在Android中,规定了只能在主线程(或者叫UI线程)中,去进行UI相关的操作,而其他线程则无法操作UI,否则报错; 但同时,由于不能再UI线程进行耗时的操作&#xff0…

Linux 指令

Linux 复制命令 一般的复制 1. cp /源文件 /目标文件夹 (:把源文件放到文件夹下) 2. cp /源文件 /目标文件名 (:把源文件命名为“目标文件夹名”) 3.如果是要复制文件夹则需要加上-R,否则只能复…

Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别

Web.xml中自动扫描Spring的配置文件及resource时classpath*:与classpath:的区别 一、Web.xml中自动扫描Spring的配置文件(applicationContext.xml) 1,首先在web.xml中配置监听器listener,让Spring进行自动获取。具体加入的代码如下…

Android 事件传递机制详解(事件的分发、拦截、处理)

1、事件在Android中的传递顺序 事件在Android的传递顺序: Activity--> Window-->DecorView --> 布局View或者说以上顺序是事件在应用层的传递顺序。如果要说整个事件的传递机制,是Android底层收到触摸屏的事件后,使用socket跨进程…

Android View的测量、布局、绘制过程详解(上)

Android View的绘制过程主要有三步: 测量 Measure布局 Layout绘制 Draw 首先理解MeasureSpec的含义,然后跟踪ViewGroup的measure、layout、draw三个方法即可 view的绘制流程是我们在自定义View中通常会使用到的一个知识点,也是一个面试常问…

Android View的测量、布局、绘制过程详解(下)

View的measure()方法是final的,因此我们无法在子类中去重写这个方法,在该方法内部会调用onMeasure()方法。所以我们自定义view时,要重写也是重写onMeasure方法。同理,layout、draw也是final的,我们根据需要重写onLayou…

Java基础内容

Java基础 Java语法 Java界面编程 Java API 1、 Java语法 1、AWT 1、Java IO 2、 面向对象 2、事件机制 2、多线程 3、 常见API 3、…

Android常用的数据库语句

1、数据库语句 1.1、创建数据库 create database 数据库名称 character set 字符集名称 ; create database 数据库名称 character set 字符集名称 collate collate名称(具体查询API) 例:create database mydb1 character set utf8 collate …