zoukankan      html  css  js  c++  java
  • Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别?

    一个帖子的整理:

    Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别
    如果你不带参数的实例化:Handler handler = new Handler();那么这个会默认用当前线程的looper
    一般而言,如果你的Handler是要来刷新操作UI的,那么就需要在主线程下跑。
    情况:
    1.要刷新UI,handler要用到主线程的looper。那么在主线程 Handler handler = new Handler();,如果在其他线程,也要满足这个功能的话,要Handler handler = new Handler(Looper.getMainLooper());
    2.不用刷新ui,只是处理消息。 当前线程如果是主线程的话,Handler handler = new Handler();不是主线程的话,Looper.prepare(); Handler handler = new Handler();Looper.loop();或者Handler handler = new Handler(Looper.getMainLooper());
    若是实例化的时候用Looper.getMainLooper()就表示放到主UI线程去处理。
    如果不是的话,因为只有UI线程默认Loop.prepare();Loop.loop();过,其他线程需要手动调用这两个,否则会报错。

    message.what,message.arg1,message.arg2,message.obj,他们在之间有什么区别呢?

    what就是一般用来区别消息的,比如你传进去的时候msg.what = 3;
    然后处理的时候判断msg.what == 3是不是成立的,是的话,表示这个消息是干嘛干嘛的(自己能区别开)


    至于arg1,arg2,其实也就是两个传递数据用的,两个int值,看你自己想要用它干嘛咯。如果你的数据只是简单的int值,那么用这两个,比较方便。


    其实这里你还少说了个,setData(Bundle),上面两个arg是传递简单int的,这个是传递复杂数据的。


    msg.obj呢,这个就是传递数据了,msg中能够携带对象,在handleMessage的时候,可以把这个数据取出来做处理了。不过呢,如果是同一个进程,最好用上面的setData就行了,这个一般是Messenger类来用来跨进程传递可序列化的对象的,这个比起上面的来,更消耗性能一些。

    http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13.html

    两篇不错的文章:

    http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445395.html

    http://www.cnblogs.com/xpxpxp2046/archive/2012/04/13/2445355.html

    本文转自:http://blog.csdn.net/thanklife/article/details/17006865

  • 相关阅读:
    MySQL 常用到的几个字符处理函数
    MySQL DATE_SUB查询工龄大于35的员工信息
    Mysql 没有nvl()函数,却有一个类似功能的函数ifnull();
    switch 循环中的case理解
    批处理系统和分时系统各具有什么特点?为什么分时系统的响应比较快?
    存储式计算机的主要特点是什么?
    代码实现导航栏分割线
    Keras函数式API介绍
    Keras通过子类(subclass)自定义神经网络模型
    R语言kohonen包主要函数介绍
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/3870393.html
Copyright © 2011-2022 走看看