android handler简单学习总结

原创 2016年05月31日 12:09:10

谈到handler,我们首先想到的就是ui更新,这个是当然了,android为我们提供了一种消息机制handler,在子线程中也可以更新到ui会出现

CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.),

那为什么在子线程中不能更新主线程ui,我们需要看看UI更新的源码:view更新UI需要调用invalidate()方法,而创建view的同时 也创建了viewrootimpl类, invalidateChildInParent(int[] location, Rect dirty)--》 checkThread();而在checkThread()里面判断当前线程id是否与主线程id相同,如果不同就抛异常

void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    } 

那那为什么要这样设计呢 ,就是为了防止多线程更新ui,导致数据紊乱问题,有人说了可以加线程锁synchronized;但是有么有会出现场线程出现死锁问题导致ui无法更新会出现卡顿,那么用户体验该多么不好,所以我们还是认命吧,用下面方法去实现更新ui





下面基于上述原理说一下更新方法: 
方法一:用Handler 

1、主线程中定义Handler: 

Java代码  收藏代码
  1. Handler mHandler = new Handler() {  
  2.   
  3.         @Override  
  4.         public void handleMessage(Message msg) {  
  5.             super.handleMessage(msg);  
  6.             switch (msg.what) {  
  7.             case 0:  
  8.                 //完成主界面更新,拿到数据  
  9.                 String data = (String)msg.obj;  
  10.                   
  11.                 updateWeather();  
  12.                 textView.setText(data);  
  13.                 break;  
  14.             default:  
  15.                 break;  
  16.             }  
  17.         }  
  18.   
  19.     };  


2、子线程发消息,通知Handler完成UI更新: 
Java代码  收藏代码
  1. private void updateWeather() {  
  2.           
  3.           
  4.         new Thread(new Runnable(){  
  5.   
  6.             @Override  
  7.             public void run() {  
  8.                 //耗时操作,完成之后发送消息给Handler,完成UI更新;  
  9.                 mHandler.sendEmptyMessage(0);  
  10.                   
  11.                 //需要数据传递,用下面方法;  
  12.                 Message msg =new Message();  
  13.                 msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
  14.                 mHandler.sendMessage(msg);  
  15.             }  
  16.               
  17.         }).start();  
  18.           
  19.     }  

方法一的Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用; 

方法二:用Activity对象的runOnUiThread方法更新 
在子线程中通过runOnUiThread()方法更新UI: 
Java代码  收藏代码
  1. new Thread() {  
  2.             public void run() {  
  3.                 //这儿是耗时操作,完成之后更新UI;  
  4.                 runOnUiThread(new Runnable(){  
  5.   
  6.                     @Override  
  7.                     public void run() {  
  8.                         //更新UI  
  9.                         imageView.setImageBitmap(bitmap);  
  10.                     }  
  11.                       
  12.                 });  
  13.             }  
  14.         }.start();  

如果在非上下文类中(Activity),可以通过传递上下文实现调用; 
Java代码  收藏代码
  1. Activity activity = (Activity) imageView.getContext();  
  2.                 activity.runOnUiThread(new Runnable() {  
  3.   
  4.                     @Override  
  5.                     public void run() {  
  6.                         imageView.setImageBitmap(bitmap);  
  7.                     }  
  8.                 });  

这种方法使用比较灵活,但如果Thread定义在其他地方,需要传递Activity对象; 

方法三:View.post(Runnable r) 

Java代码  收藏代码
  1. imageView.post(new Runnable(){  
  2.   
  3.                     @Override  
  4.                     public void run() {  
  5.                         imageView.setImageBitmap(bitmap);  
  6.                     }  
  7.                       
  8.                 });  

Android之Handler简单用法

今天給大家带来的是Androidzh
  • Joker_Ya
  • Joker_Ya
  • 2014年10月22日 20:09
  • 6286

Android Handler简单例子

package com.example.handler; import android.os.Bundle; import android.app.Activity; import android....
  • flyfight88
  • flyfight88
  • 2013年02月21日 14:22
  • 3082

关于Handler的简单总结

1.Handler的主要作用:      1.在新启动的线程当中发送消息。      2.在主线程中获取并处理消息。 2.为什么要使用Handler?     如果不用handler发送消息,然后更新...
  • qq_29882585
  • qq_29882585
  • 2016年09月21日 21:04
  • 1122

简单的学习总结

燕十八说:“学习PHP,最快28天就足够了”。 对我来说已经过去一个月了,了解了一些基本知识,从一开始配置apache + php + mysql环境就要了一个星期,从面对错误不知道如何解决...
  • g5g5t9
  • g5g5t9
  • 2016年11月11日 11:43
  • 186

Android个人学习小结2016.4

以下内容仅为个人初学Android小结及生活,不太适合其他人看。1、 无论在哪里,在做什么,只要坚持学习、探索、创造价值,其他的东西自然都会来的。2、微信-我的-钱包-城市服务-社保查询,可以查个人社...
  • forgot2015
  • forgot2015
  • 2016年05月31日 00:07
  • 959

Handler的基本简单使用

本文主要介绍Handler几种常见的基本用法 第一种:子线程给主线程发消息 这种最基本常用 final android.os.Handler handler=new android.os.Handl...
  • u012216899
  • u012216899
  • 2016年12月03日 15:38
  • 248

来自知乎的Android学习总结

转自知乎: http://www.zhihu.com/question/26417244 之前写了一篇博客 Android学习之路 被疯狂转发,带起了一阵学习Android的大风,我不晓得具体影...
  • Bob1993_Dev
  • Bob1993_Dev
  • 2014年12月24日 14:42
  • 2822

JVM简单个人总结(一)

说明:这篇文章只是个人对JVM的初步探讨总结,很多概念来自网络,加入部分个人理解,也许个人理解的地方有误,也恳请看到的同学帮忙指出,关于JVM的具体知识可以阅读《深入理解Java虚拟机:JVM高级特性...
  • KevinWu93
  • KevinWu93
  • 2016年03月16日 23:11
  • 490

JAVA 学习 自我总结

学习总结: 孔子曰学而时习之 不亦悦乎 。学习了新的东西,一定要及时练习和总结,并多次回想记忆,这样才能将知识记忆的牢固; 之前我学习东西只知道贪多,想一口吃一个胖子;但是每次都是事倍功半,这样又...
  • u010582345
  • u010582345
  • 2016年04月08日 23:58
  • 422

android一年来学习的总结---项目梳理篇

一年了,其实说的上比较正式的项目是学习
  • u010665691
  • u010665691
  • 2014年09月20日 09:45
  • 843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android handler简单学习总结
举报原因:
原因补充:

(最多只允许输入30个字)