Why?

    因为在Android系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。为了解决这一个问题,

  android制定了一条规则:只允许UI线程来修改UI组件的属性等,也就是说必须单线程模型,这样导致如果在UI界面进行一个耗时叫长的数据

  更新等就会形成程序假死现象 也就是ANR异常,如果20秒中没有完成程序就会强制关闭。所以比如另一个线程要修改UI组件的时候,

  就需要借助Handler消息机制了。

Use Status?  

  1.在新启动的线程中发送给消息

  2.在主线程获取、处理消息

    Handler 的执行过程

    角色描述:
    1) Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue

    2) Handler: 你可以构造Handler对象来与Looper沟通,以便push 新消息到 Message Queue里,或者
      接收Looper从Message Queue 里所送来的消息。

    3)Message Queue(消息队列):是用来存放线程放入的消息。

    4)线程:UI thread 通常就是 main thread,而Android 启动程序时会替它建立一个Message Queue。

      每一个线程里可含有一个 Looper 对象以及一个 Message Queue 数据结构。在你的应用程序里,
      可以定义 Handler 的子类别来接收 Looper 所送出的消息。

Detail?

  Handle发送和处理消息的几个方法:

    1. void  handleMessage( Message  msg):处理消息的方法,该方法通常被重写。

     2.final boolean hasMessage(int  what):检查消息队列中是否包含有what属性为指定值的消息

     3.final boolean hasMessage(int what ,Object object) :检查消息队列中是否包含有what好object属性指定值的消息

     4.sendEmptyMessage(int what):发送空消息

    5.final Boolean send EmptyMessageDelayed(int what ,long delayMillis):指定多少毫秒发送空消息

    6.final  boolean sendMessage(Message msg):立即发送消息

    7.final boolean sendMessageDelayed(Message msg,long delayMillis):多少秒之后发送消息

Demo:

  

    private static String image_path = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";private ImageView imageView_1;private Button button_1;private Button button_2;//Handler定义并重写handleMessage方法private Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {if (msg.what == 1) {System.out.println(">>>>>STEP2");byte[] data = (byte[]) msg.obj;Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);imageView_1.setImageBitmap(bmp);}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_choose);button_1 = (Button) findViewById(R.id.Yes);imageView_1 = (ImageView) findViewById(R.id.imageView);button_1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(image_path);HttpResponse httpResponse = null;try{Thread.sleep(10000);httpResponse = httpClient.execute(httpGet);byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());//定义Message,并把Message传给HandlerMessage msg = Message.obtain();msg.what=1;msg.obj=data;System.out.println(">>>>>STEP1");handler.sendMessage(msg);} catch(Exception e){e.printStackTrace();}}}).start();}});        }

效果:

                        

参考博客: http://blog.csdn.net/x605940745/article/details/13001279

http://www.cnblogs.com/youxilua/archive/2011/11/25/2263825.html

转载于:https://www.cnblogs.com/udld/p/4313973.html

Android——多线程之Handler相关推荐

  1. Android–多线程之Handler下载图片源码

    Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不允许Activity新启动的线程访问该Acti ...

  2. Android 多线程之Handler

    前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不允许Activity新启动的线程访问该A ...

  3. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  4. Android 多线程之IntentService 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...

  5. Android 多线程之HandlerThread 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426353 出自[zejian的博客] 关联文章: Android ...

  6. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  7. Android--多线程之Handler

    原文:https://www.cnblogs.com/plokmju/p/android_Handler.html 前言 Android的消息传递机制是另外一种形式的"事件处理", ...

  8. android handlerthread 线程管理,Android多线程之HandlerThread源码解析

    一.概述 先来了解一下HandlerThread的几个特性 HandlerThread继续于Thread,本身就是一个线程类 HandlerThread在内部维护了自己的Looper对象,所以可以进行 ...

  9. android handlerthread 线程管理,Android线程之HandlerThread

    概述 HandlerThread是Thread的一个子类,是Android中提供的另一种线程形态. Handy class for starting a new thread that has a l ...

  10. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

最新文章

  1. 快速排序原理及代码模板
  2. java内部类的特点
  3. Python学习6——条件,循环语句
  4. AVB2 avbtool.py脚本常用命令
  5. 关于家庭无线局域网的连接
  6. 高通侧目!联发科发布面向高端手机的5G芯片
  7. 开源老兵教你如何评估一项技术是否值得长期投入?
  8. java兵临城下_再谈java事件监听机制
  9. [hdu 1003] Max Sum
  10. iOS申请真机调试证书-图文详解
  11. Windows客户端开发--URLDownloadToFile下载文件进度条
  12. html 数据交互动画,纯css实现可交互的动画
  13. mybatis (高级映射 缓存 延迟加载)
  14. 小米路由器3G建站折腾笔记4 - 安装opkg和onmp
  15. Mac浏览器有好多种,那么哪款好用呢?
  16. 我的世界未能从服务器注册表数据,【经验之谈】“User Profile Service 服务未能登录,无法加载用户配置文件”实战历程...
  17. 王者荣耀角色信息在哪个服务器,怎么查询王者荣耀角色在哪个区
  18. Fragment销毁自己
  19. php 获取pr,获取网站 百度权重 搜狗 谷歌PR
  20. 阿里云BaaS下蚂蚁区块链开发实践(一)

热门文章

  1. 【设计篇】系统应该构建与使用分离
  2. Linux基础命令---cat
  3. XJTUOJ13 (数论+FFT)
  4. php获取用户 地区 、ip地址
  5. textarea光标处插入文字
  6. placeholder在不同浏览器下的表现及兼容方法 placeholder兼容
  7. mybatis源码解析 - 通过一个简单查询例子分析流程
  8. Android沉浸式(侵入式)标题栏(状态栏)Status(三)
  9. Rest风格中关于JPA使用懒加载的坑
  10. ios控件 UIViewController