事件处理方式 && 消息传递机制

来源:互联网 发布:魏晋风骨 知乎 编辑:程序博客网 时间:2024/06/05 02:17

所有的android事件,都是通过底层驱动将事件整理成Message放入到相应的MessageQueue,再通过Looper来分发,最终到达控件或者Activity的监听器或者事件处理函数。

基于监听的事件处理
    为组件绑定特定的事件监听器。View.setOnClickListener(OnClickListener);
    Event Source\ Event\ Event Listener
    1)内部类做监听器类
    2)外部类做监听器类
    3)Activity做事件监听器
    4)匿名内部类做事件监听器
    5)直接绑定到标签 android:onClick
基于回调的事件处理
    重写组件特定的回调方法,或者重写Activity的回调方法。
    基于回调的事件处理模型,事件源和事件监听器是统一的,事件源本身负责处理事件。
    基于回调的事件处理机制可通过自定义View实现,自定义View时重写该View的事件处理方法即可。

    事件处理方法返回true,表示该处理方法已经完全处理该事件,事件不会继续传播;
                    返回false,表示该处理方法并未完全处理该事件,事件会继续传播出去。

    事件传递顺序:
        先到监听器,然后是组件的事件回调(这里有ViewGroup的onInterceptTouchEvent等复杂的传递),然后是Activity的事件回调。

    基于监听的事件处理模型更有优势:1)事件源和监听器分开,更明确的分工;2)优先出发监听器。

响应系统设置的事件:
Configuration类描述手机设备的配置信息,通过Activity.getResources().getConfiguration();获取。
通过访问其属性可以得到各种配置。
Activity.onConfiurationChanged(),监听系统配置变化的事件。

Handler \MessageQueue \Looper \Message
Handler的作用:1.发送消息;2.处理消息。
    Handler发送消息是发送到指定的MessageQueue;Looper读取MessageQueue的消息,然后交给发送该消息的Handler处理。
每个线程只能有一个Looper以及配套的一个MessageQueue,在Looper的构造过程中会初始化MessageQueue。
UI线程种已经初始化了一个 Looper 和MessageQueue,因此我们可以直接写Handler处理消息即可。
用户新建的线程则需要初始化Looper,并启动它。
    1)Looper.prepare();
    2) 创建Handler,并重写handleMessage。
    3) Looper.loop();

发送消息调用Handler.sendMessage(Message);等相关函数。

MessageQueue中有一个Message mMessage;的成员,应该是队列的头,
每个Message中有一个Message next;的成员,指向下一个消息。
Handler发送消息的详细过程?
Handler.sendMessage(Message msg);
Handler.sendMessageDelayed(Message msg, long delayMillis);
Handler.sendMessageAtTime(Message msg, long uptimeMillis);
private Handler.enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis);
    在其中把当前Handler的this赋给msg的target.然后将消息插入队列,
private MessageQueue.enqueueMessage(Message msg, long when);

Looper分发Message的方式?
Message有个Handler target的私有成员。
Looper在loop()中,不断从MessageQueue取消息出来(调用MessageQueue.next()),
然后调用Message中Handler target的dispatchMessage()分发消息。
而Handler. dispatchMessage()判断有没有回调函数CallBack,若无则直接调用Handler的handleMessage().
其中handleMessage()是接口类CallBack的一个接口,用户必须实现。

异步任务

AsyncTask<Params,Progress,Result>将耗时操作丢给后台线程去操作。

    1)创建AsyncTask子类,并指定其参数类型。
    2) 重写必要的方法,doInBackGround\onProgressUpdate\onPreExecute\onPostExecute

    3) 调用AsyncTask子类实例的execute()方法。


0 0
原创粉丝点击