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() { @Override
public 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);
}
}
}; @Override
protected 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() { @Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public 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传给Handler
Message 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

最新文章

  1. C# 委托&事件
  2. Microsoft Visual Studio 开发的C++程序软件发布相关事宜
  3. mysql: unknown variable 'character-set-client=utf8'
  4. php5.3 appache phpstudy win7win8win10下 运行速度慢解决办法
  5. BZOJ 2186 [Sdoi2008]沙拉公主的困惑 【逆元】
  6. CSS的单位及css3的calc()及line-height百分比
  7. Android.mk中添加宏定义
  8. 从linux内核代码分析操作系统启动过程
  9. spring IOC经典理解
  10. extjs+Aspose.Cells导出到Excel
  11. SQL 语句中的union操作符
  12. 2017上海QCon之旅总结(中)
  13. [ Java学习基础 ] Java的封装性与访问控制
  14. MongoDB 如何实现备份压缩
  15. 论文笔记:Fast Online Object Tracking and Segmentation: A Unifying Approach
  16. 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示
  17. echarts动态添加数据
  18. luogu P3522 [POI2011]TEM-Temperature
  19. c#单元测试:使用Moq框架Mock对象
  20. 关于JAVA架构师

热门文章

  1. Caffe学习笔记2
  2. Linux汇编教程03:大小比较操作
  3. Linux进程的创建函数fork()及其fork内核实现解析
  4. 2015多校第8场 HDU 5382 GCD?LCM! 数论公式推导
  5. 阿里云ECS的使用
  6. Iptables基础整理
  7. leetcode 之Reverse Nodes in k-Group(22)
  8. Integer to Roman——相当于查表法
  9. Pow(x, n)——这也能用二分法!!!!
  10. centos7.5安装opendesktop