zoukankan      html  css  js  c++  java
  • 涛涛的小马甲 Android之Handler机制

    首先需要了解一个基本的概念ANR:Application not response 即应用程序无响应,也就是俗话说的死机。

    出现Anr的原因是:

    主线程需要做很多重要的事情,响应点击事件,更新UI
    如果在主线程里面阻塞过久的时间,应用程序会无响应。

    为了避免应用程序出现anr,所有的耗时操作都应该放在子线程里执行。像访问网络的操作只能在子线程里面执行


    解决的方法:
    主线程执行中---->包含一个Handler的对象,message queue 用来放置消息队列,Looper则不停 的查看message queue
    里是否有待处理的消息,如果有就交给handler里的handleMessage方法处理请求。
    子线程--->获取了一个资源要改变主线程的UI--->向主线程发送一个请求。
    那么:在主线程里有一个类叫做Handler,消息处理器,用来处理子线程发送来的改变UI的请求。
    总结:
    1.在子线程里利用handler发送一条消息请求,该请求被放在主线程的message queue里。//message queue是一个队列先进先出。
    2.在主线程里有一个looper的消息轮询器,就相当于一个巡逻人员,不停的查看message queue里是否有待处理的消息请求
    3.如果looper发现了新的消息,就调用handlemessage的方法来处理消息。注意只有主线程才能修改view对象。

    handler处理流程图如下:

    //代码编写步骤:
    1.主线程创建消息处理器
    2.在子线程里把消息发送给主线程
    3.当looper得到消息之后调用handlemessage的方法处理消息。
    private Handler handler = new Handler();
    public void handleMessage(Message msg){
    if(msg.what ==123){
    Bitmap bitmap = (Bitmap)msg.obj;
    iv.setImageBitmap(bitmap);//iv为主界面中的ImageView。
    }


    }
    //以下是子线程发送消息给主线程
    Message msg = new Message ();
    msg.what=123;
    msg.obj =bitmap;
    handler.sendMessage(msg);

    //注意:Toast显示的内容也属于更新UI操作,故也需要进行handler处理。

  • 相关阅读:
    环境变量
    多重继承
    参数检查(@property)
    限制属性绑定(__slots__)
    实例属性和类属性
    2017-11-28 中文编程语言之Z语言初尝试: ZLOGO 4
    2017-10-23 在各种编程语言中使用中文命名
    2017-11-27 汉化了十数个编译器的前辈的心得体会
    五行
    阴阳
  • 原文地址:https://www.cnblogs.com/Jeely/p/10949314.html
Copyright © 2011-2022 走看看