zoukankan      html  css  js  c++  java
  • Android消息机制

    Android消息机制

    每个Android应用在启动的时候都会创建一个线程。这个线程被称为主线程或者UI线程。Android应用的全部操作默认都会执行在这个线程中。
    可是当我们想要进行数据请求,图片下载。或者其它耗时操作时,是不可能在这个UI线程做的。由于Android在3.0以后的版本号已经禁止了这件事情,直接抛出一个异常。所以我们须要一个子线程来处理那些除UI操作的事情。
    可是这个又会有一个问题。我们仅仅能在UI线程进程UI操作,仅仅能在子线程进行耗时操作。假设我们须要在耗时操作结束后在Android界面上显示一个View,我们应该怎么做?我们是不可能在子线程直接刷新UI的。这时我们须要用到Android的消息机制。来实现主线程和子线程的通信。简单来说,就是子线程获取到数据之后,不直接进行UI更新,而是把数据装到消息中发送到主线程,主线程中有一个循环轮询会马上收到子线程发过来的信息,然后拿到消息数据后在主线程更新UI 。说起来比較简单。我们来细致的看一下详细是怎么说的。

    处理消息的手段——Handler, Looper, MessageQueue

    Handler

    我们先解说一下Handler,Handler顾名思义就是处理者,通常对他的使用方法是在UI线程中新建一个Handler,并覆写他的handleMessage, 然后再耗时的线程中将消息postUI线程。样例例如以下:

    class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
        //更新UI
        }
    }
    
    MyHandler mHandler = new MyHandler();
    new Thread(){
        public void run(){
            mHandler.sendEmptyMessage(123);
        };
    }.start();

    这里规定了Handler必须在主线程创建。由于仅仅有在UI线程创建才会让Handler关联到已有的MessageQueue

    MessageQueue被封装到Looper中,而Looper又通过ThreadLocal封装到一个线程中。最后相当于MessageQueue关联了一个线程。所以简单来说就是Handler将消息投递到一个关联了线程的MessageQueue中,然后Handler在从MessageQueue中取出消息,而且处理它。
    我们看一下Handler的2个经常使用的方法

    void handleMessage(Message msg) : 处理消息的方法
    final boolean sendMessage(Message msg) : 马上发送消息

    第一个方法 我们通常在 查看全文

  • 相关阅读:
    git 知道这些就够了
    接私活可用的 Springboot + Vue 快速开发框架
    Vue 组件传值
    Vue实现点击按钮复制功能
    vue 获取组件高度
    git commit 提交的时候报错husky > pre-commit hook failed (add --no-verify to bypass)(解决办法)
    vue中异步函数async和await的用法
    JS设置浏览器缩放比例
    CSS修改滚动条的样式
    JS代码查看浏览器页面放大比例
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7169335.html
Copyright © 2011-2022 走看看