关闭

Looper简析

87人阅读 评论(0) 收藏 举报

参考http://blog.csdn.net/fesdgasdgasdg/article/details/52081773

  • 在异步线程中创建Handler(不带参数的构造方法)需要Looper.prepare( ),但是这个Handler是子线程的(可知Handler在哪个线程执行,就只是哪个线程的,并非所有的Handler都能执行UI操作,它只是一个辅助机制),如下,执行更新UI的操作会崩溃。
        new Thread(){
            @Override
            public void run() {
                super.run();
                Looper.prepare();
                Handler handler = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        //子线程UI操作会导致闪退
                        et.setText("33");
                    }
                };
                Looper.loop();
                handler.sendEmptyMessage(0);
            }
        }.start();
  • 在创建Handler对象的过程中,回去获取当前线程的Looper对象,如果当前线程没有掉用过Looper.prepare() 将得到一个运行时错误:

        if (mLooper == null) {
            throw new RuntimeException(
            "Can't create handler inside thread that has not called Looper.prepare()");
        }
  • 当然也可以通过带参数(参数为主线程的Looper)的方式构造Handler,如下,此时这个Handler是运行在主线程的,可以直接更新UI

        new Thread(){
            @Override
            public void run() {
                super.run();
                Handler handler = new Handler(Looper.getMainLooper()){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        et.setText("33");
                    }
                };
                handler.sendEmptyMessage(0);
            }
        }.start();
  • Activity中能直接创建Hnadler是因为已经在UI线程里面已经实例化了一个Looper,如下(Looper类准备一个主线程的Looper):

        /**
          * Initialize the current thread as a looper, marking it as an
          * application's main looper. The main looper for your application
          * is created by the Android environment, so you should never need
          * to call this function yourself.  See also: {@link #prepare()}
         */
        public static void prepareMainLooper() {
        prepare(false);
         synchronized (Looper.class) {
            if (sMainLooper != null) {
                throw new IllegalStateException("The main Looper has already been prepared.");
            }
            sMainLooper = myLooper();
         }
        }

    上面这个方法的调用又是在ActivityThread(应用的主线程就是它)的main方法中,ActivityThread是在启动应用时系统创建的。而且Activity在attach方法中会传过来一个ActivityThread对象,并且使用这个ActivityThread对象赋予当前Activity的ActivityThread对象,至此,主线程的Looper就创建完成了,而这一切是由android系统完成的,我们不需要也不能手动创造主线程的Looper。

  • 一个handler实例可以用来发送和处理message,也可以与一个runnable对象关联.

  • 每一个handler只可以与一个looper关联,一个线程最多只能有一个looper,
  • 一个looper内置一个唯一的messageQueue。在同一个线程中,你可以再创建一个handler,与同一个looper和messageQueue关联。若多个handler关联同一个looper,则发送的message都会装载同一个messageQueue里面,由同一个looper管理。
  • looper抽取出message后,会让message找的妈妈。message是谁发送的,就有谁的handleMessage()方法处理。因为message.target = handler,message持有妈妈的电话号码
0
0
查看评论

简析Handler、MessageQueue、Looper

刚接触android的时候,对Handler的工作机制什么的一头雾水,只明白这些东西写下了就可以用了。所以这一篇就写Handler,纪念逝去的青春......
  • mcy456
  • mcy456
  • 2015-12-28 11:57
  • 912

Handler,Looper,MessageQueue简析

Handler的构造函数: 通过Looper.myLooper()获取Looper对象 检测Looper对象是否为null (主要是看是否调用过Looper.prepare()) 从Looper对象中获取MessageQueue Handler的sendMessage(): 最终调用sen...
  • zzj000
  • zzj000
  • 2017-12-28 11:10
  • 26

Android Looper用法及原理

Looper是android为线程间异步消息通信提供的一种机制,利用Looper机制可以方便我们实现多线程编程时线程间的相互沟通。当然,如果不用Looper而采用其它的线程间通信方式(像管道,信号量,共享内存,消息队列等)也是一样的。Looper的实现是利用消息队列的方式,为用户封装了一层API,用...
  • linghaidong
  • linghaidong
  • 2017-01-25 15:00
  • 1411

android Looper类介绍

Android-Looper类介绍 您的评价:        收藏该经验      &...
  • songjunyan
  • songjunyan
  • 2014-09-15 17:41
  • 854

关于Looper的使用

我们知道,在android的线程里,是从message loop取出信息来处理的,主线程和子线程、子线程和子线程之间的通讯也是Looper来实现的,接下来我就简单介绍下Looper的使用方法。  主线程(即UI线程)自身就有message loop,不需要创建,而其他线程就需要手动创建,...
  • jhg19900321
  • jhg19900321
  • 2012-09-11 00:02
  • 1110

Looper、Handler在子线程中的应用

Looper类:为一个线程开启一个消息循环,里面有一个消息队列,新线程是没有开启消息循环的,所以需要用到Looper的方法创建消息循环(主线程除外,主线程会自动为其创建Looper对象,开启消息循环),MessageQueue存放消息和事件   Handler类:辅助类,向绑定...
  • namePeng
  • namePeng
  • 2016-04-28 16:45
  • 1192

Android中Looper的实现原理

Android中Looper的实现原理,为什么调用Looper.prepare()就在当前线程关联了一个Looper对象,它是如何实现的。 1、线程间通信机制 首先,looper、handler、messagequeue三者共同实现了android系统里线程间通信机制。如在A、B两个子线程之间...
  • syc434432458
  • syc434432458
  • 2015-09-08 11:30
  • 1308

Looper中的睡眠等待与唤醒机制

Looper中的睡眠等待与唤醒机制 C++类Looper中的睡眠和唤醒机制是通过pollOnce和wake函数提供的,它们又是利用操作系统(Linux内核)的epoll机制来完成的。当被监控的文件(通过epoll_ctl的EPOLL_CTL_ADD添加进去)可I/O时,epoll_wait调用会从...
  • broadview2006
  • broadview2006
  • 2013-01-29 13:13
  • 4445

Android多线程消息处理机制(一) Looper、Thread专题

在处理android多线程消息机制时,会因为Handler而了解到有Looper这么个东西。有众多高手解释道:Looper是消息泵。它内部维护了一个消息队列,即MessageQueue。Looper的职责就是负责抽取MessageQueue中的消息让他去找宿主。 对于一些普通的程序开发工作而言,只...
  • fesdgasdgasdg
  • fesdgasdgasdg
  • 2016-07-31 23:33
  • 2479

Android中的Handler,Looper,Message机制

Android的消息处理有三个核心类:Looper,Handler和Message。其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因此我没将其作为核心类。下面一一介绍: 线程的魔法师 Looper Looper的字面意思是“循环者...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2013-11-29 12:03
  • 4350
    个人资料
    • 访问:9608次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论