参考教程:iMooc关于Handler,http://www.imooc.com/learn/267

参考资料:Google提供Android文档Communicating with the UI Thread

Handler的作用:

  Android开发中不允许UI主线程之外的线程更新,那么在主线程下建立Handler对象用于接收其他线程传来的数据(由Message携带)更新UI是Android提供的方法之一,另一个是我们熟知的更加轻量的AsyncTask类,这里不做展开,详细的Handler+Thread与AsyncTask的区别见AsyncTask和Handler的优缺点比较。将耗时的操作用其他Thread执行,执行完毕后传送给Handler对象一个Message,然后由Handler将传来的数据交给UI主线程。

  Handler要解决的根本问题是Android线程并发,如果没有相应的机制约束各线程的协作并发,很容易导致开发上和运行上的混乱。Android处理多线程的方式也不是传统上的加锁机制(性能因素吧),而是MessageQueue,即消息队列,开发者可以直接控制消息队列的显示顺序和方式,这样就不会产生数据的同步混乱的问题了。

  写一个小Demo,帮助理解Handler的使用。用新建Thread处理下载图片和显示图片两个操作。

  在MainActivity的onCreate方法中添加一个新的线程:

        //初始化View
imageView = (ImageView) findViewById(R.id.imageView);
//添加Thread用于下载图片和更新UI
new Thread(new MyRunnable()).start();

  

  MyRunnable类

public class MyRunnable implements Runnable {

    Activity mActivity;

    private Message msg;
private Bitmap imageBitmap;
private static final String urlData = "http://sfault-avatar.b0.upaiyun.com/166/281/166281916-1140000000145114_huge128";
@Override
public void run() {
msg = new Message();
imageBitmap = getHttpImage(urlData);
msg.obj = imageBitmap; //将imageBitmap用msg传给MainActivity中的handler
MainActivity.handler.sendMessage(msg); } //用网址 urlData 读取图片的Bitmap
private Bitmap getHttpImage(String urlData) {
Bitmap bitmap = null;
try {
URL url = new URL(urlData);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(5*1000);
httpURLConnection.setDoInput(true);
httpURLConnection.connect(); InputStream inputStream = httpURLConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream); inputStream.close();
httpURLConnection.disconnect(); } catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} return bitmap;
}
}

  回到MainActivity中,初始化handler,并重写其handleMessage方法,代码如下:

public static Handler handler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); //从msg中获取图片的bitmap
Bitmap bitmap = (Bitmap) msg.obj;
//更新UI
imageView.setImageBitmap(bitmap);
}
};

总结,用Handler+Thread的方式执行单一线程确实比较繁琐,用AsyncTask会更简洁高效。但是在比较复杂的多线程应用场景下,用Handler建立MessageQueue的机制管理线程操作更加条理。

最新文章

  1. java重载与覆写
  2. 应用程序框架实战十五:DDD分层架构之领域实体(验证篇)
  3. Maven配置不成功
  4. maven junit 单元测试插件配置
  5. IT应届生如何准备找工作?
  6. 堆排序(C++版)
  7. C++builder XE 安装控件 及输出路径
  8. 设置文字在div中垂直居中,使用line-height
  9. 内核参数优化之1 keepalive解析
  10. 《Java程序员面试笔试宝典》之 instanceof有什么作用
  11. python手记(45)
  12. 基于visual Studio2013解决C语言竞赛题之0523魔方阵
  13. 如何在ASP.NET Core Web API测试中使用Postman
  14. 调用MediaScannerConnection 发生内存泄露的解决方法
  15. 原生js查询、添加、删除类
  16. LeetCode第二十三题-合并n个有序链表
  17. java生成UUID
  18. Linux sed使用方法
  19. esp-adf Element PipeLine
  20. 微信和支付宝支付模式详解及实现(.Net标准库)

热门文章

  1. sql搜索like通配符的用法详解
  2. HTML5 canvas beginPath() 方法
  3. NPOI Helper文档
  4. QT中的C/S通信问题:关于服务器端readyread()信号不发射
  5. DirectX12 Samples 学习笔记 – PredicationQueries
  6. <?xml version="1.0" encoding="UTF-8"?> 的作用?
  7. I/O流——字符流
  8. Chain Of Responsibility(职责连)-对象行为型模式
  9. otter双主同步安装与配置
  10. Codeforce 370J Bottles(动态规划-01背包)