Handler的小结

Handler在android里负责发送和处理消息。它的主要用途有:

  1)按计划在将来的某个时刻发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,进行任务排队,避免线程冲突(常见于更新UI线程)

   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper  looper, Handler.Callback callback) 可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个 Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以 sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。


在系统的music的源码中有一段自定义了HandleThread,

    private static class Worker implements Runnable {
        private final Object mLock = new Object();
        private Looper mLooper;
        
        /**
         * Creates a worker thread with the given name. The thread
         * then runs a {@link android.os.Looper}.
         * @param name A name for the new thread
         */
        Worker(String name) {
            Thread t = new Thread(null, this, name);
            t.setPriority(Thread.MIN_PRIORITY);
            t.start();
            synchronized (mLock) {
                while (mLooper == null) {
                    try {
                        mLock.wait();
                    } catch (InterruptedException ex) {
                    }
                }
            }
        }
        
        public Looper getLooper() {
            return mLooper;
        }
        
        public void run() {
            synchronized (mLock) {
                Looper.prepare();
                mLooper = Looper.myLooper();
                mLock.notifyAll();
            }
            Looper.loop();
        }
        
        public void quit() {
            mLooper.quit();
        }
    }
初始化的时候

        mAlbumArtWorker = new Worker("album art worker");
        mAlbumArtHandler = new AlbumArtHandler(mAlbumArtWorker.getLooper());

退出的时候

    @Override
    public void onDestroy()
    {
        mAlbumArtWorker.quit();
        super.onDestroy();
        //System.out.println("***************** playback activity onDestroy\n");
    }


       Looper 
        Looper扮演着一个Handler和 消息队列之间通讯桥梁的角色。程序组件首先通过Handler把 消息传递给Looper,Looper把 消息放入队列。Looper也 把消息队列里的消息广播给所有的Handler,Handler接 受到消息后调用handleMessage进 行处理。 

       1)   可以通过Looper类 的静态方法Looper.myLooper得 到当前线程的Looper实 例,如果当前线程未关联一个Looper实 例,该方法将返回空(null)它不会抛空指针异常。 

       2)   可以通过静态方法Looper. getMainLooper方法得到主线程的Looper实 例 这里需要注意一下 主线程默认是有一个Looper对象的。但是我们自己定义的子线程没有的。那么我们怎么在子线程中得到Looper对象呢?如果一个线程中调用Looper.prepare(),那么系统就会自动的为该线程建立一个消息队列,然后调用 Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。这个如何发送消息和如何处理消息可以再其他的线程中通过 Handle来做,但前提是我们的Hanle知道这个子线程的Looper,但是你如果不是在子线程运行 Looper.myLooper(),一般是得不到子线程的looper的。


同样的可以用HandlerThread来代替,HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装,简单说就是 消息队列+消息循环。

HandlerThread handlerThread = new HandlerThread("threadone");   
handlerThread.start();   
mHandler =  new Handler(handlerThread.getLooper());   

参考  http://www.cnblogs.com/moonvan/archive/2011/04/22/2024979.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信小程序 handler 是一个处理程序,用于处理微信小程序中的用户请求和事件。它可以通过编写 JavaScript 代码来实现。handler 可以响应小程序中的各种事件,例如用户点击按钮、滑动屏幕、输入文本等。在响应这些事件时,handler 可以读取和修改小程序的数据和状态,以便实现各种功能和交互效果。在编写 handler 时,需要了解小程序的基本架构和 API,以及 JavaScript 的基本语法和编程思想。 ### 回答2: 微信小程序 handler 是指在小程序中负责处理各种事件和请求的函数或方法。它是小程序开发过程中非常关键的一部分,通过 handler 可以实现小程序的各种功能和交互。 在微信小程序中,handler 函数可以分为页面级别的和组件级别的。页面级别的 handler 主要是处理页面中的事件,如点击事件、滑动事件等。当用户在页面上发生了操作,比如点击按钮,handler 函数会被调用执行相应的操作代码,比如跳转到其他页面或发送请求等。 而组件级别的 handler 主要是处理组件内部的事件,比如按钮组件、滑动选择器等,当用户在组件上发生了操作,比如点击了按钮,handler 函数会被调用执行相应的操作代码,比如改变组件的显示状态或发送请求等。 handler 函数可以携带参数,用来传递事件的相关信息或者其他自定义数据。在小程序中,通过事件对象的属性可以获取到事件的详细信息,比如点击事件可以获取到点击的位置、滑动事件可以获取到滑动的距离等。开发者可以利用这些信息来进行相应的逻辑处理和数据操作。 另外,handler 函数还可以与小程序的数据绑定机制结合使用。通过绑定数据和事件,在 handler 函数中可以修改数据的值,从而实现数据的更改和动态展示。 总的来说,微信小程序的 handler 在开发中起到了非常重要的作用,通过它可以实现页面和组件的交互,处理各种事件和请求,以及实现数据的更改和展示,提升了小程序的功能性和用户体验。 ### 回答3: 微信小程序中的 handler,即处理器,是指在小程序中处理用户的请求和业务逻辑的模块。handler负责接收和解析用户发出的请求,然后根据请求的类型和内容进行相应的处理。 handler在小程序的开发过程中扮演了重要的角色。它可以接收用户的点击事件、表单提交、网络请求等各种类型的请求,并根据具体的业务需求进行相应的处理和响应。 对于点击事件的处理,handler可以监听用户的点击操作,例如点击按钮、滑动屏幕等等。当用户进行了相应的操作后,handler会被触发,根据事件的类型和具体的逻辑,来执行相应的操作,例如跳转页面、显示或隐藏某个元素等。 对于表单提交的处理,handler可以监听表单的提交事件,并获取表单中的数据。通过自定义的业务逻辑,handler可以对数据进行处理,例如验证表单的合法性、调用相关接口进行数据提交等。 与服务器的交互也是handler的一项重要任务。通过网络请求的方式,handler可以发起HTTP请求并接收服务器返回的数据。在收到数据后,handler可以对数据进行解析和处理,然后将处理结果渲染到页面上。 总之,微信小程序中的handler是一个灵活且重要的模块,负责处理用户的各种操作和事件,并根据具体的业务需求进行相应的逻辑处理和响应。通过handler,我们可以实现小程序的各种功能,提供更好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值