• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android消息机制之Handler,androidhandler

Android消息机制之Handler,androidhandler

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android handler机制,android中handler机制,android中的handler,android handler,android handler用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android消息机制之Handler,androidhandler


Android为什么要提供Handler

Android建议我们不要在UI线程中执行耗时操作,因为这很容易导致ANR异常(在Android源码中我们可以看到,UI如果对用户的操作超过5秒无响应,就会报ANR异常)。因此,一些耗时操作都会在子线程中完成。当我们在子线程中获取了数据,要将其显示到UI中,如果没有Handler,这将很难完成。因此,Android之所以提供Handler,就是为了解决子线程访问UI的问题。
为什么Android不允许在子线程中访问UI呢?显然这样做不安全,多线程访问UI是不安全的(学过操作系统的盆友应该都了解线程互斥,这里我就不详细介绍了)。有人就会说了,可以通过设置信号量来解决啊。这中方法不是不可以,因为这种方法会使访问UI的逻辑变得复杂;其次这会降低UI的访问效率。而使用Handler就比较简单高效。Handler是同个Message来通讯的。

 

Handler的用法

使用Handler时,需要重写handleMessage方法,在handleMessage中接受新线程发来的Message,并做相应的处理。在新线程中则是通过Message来传递消息,Message中往往也携带着需要传递的数据以及消息的类型。还要强调一点,如果当前线程有Looper就不需要执行Looper.prepare(),如果没有,就需要在新线程内执行Looper.prepare(),否则会报错。具体使用代码如下:

 1 public class MainActivity extends AppCompatActivity {
 2     private Handler mHandler=new Handler(){
 3         @Override
 4         public void handleMessage(Message msg) {
 5             switch (msg.what)
 6             {
 7                 case 1:
 8                     //执行需要修改的UI操作
 9                     break;
10                 default:
11                     break;
12             }
13         }
14     };
15 
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20 
21         new Thread(new Runnable() {
22             @Override
23             public void run() {//在新线程中执行耗时操作
24 
25                 //如果当前线程有Looper就不需要执行Looper.prepare();
26                 Looper.prepare();
27                 try {
28                     Thread.sleep(1000);//睡眠1秒
29                 } catch (InterruptedException e) {
30                     e.printStackTrace();
31                 }
32 
33                 //操作完成之后通过发送Message,来通知Handler进行UI操作
34 
35                 Message msg=new Message();
36                 msg.what=1;
37 
38                 /*这部分是伪代码,value 是想通过Message传递的值
39                 Bundle data=new Bundle();
40                 data.putSerializable("key",value);
41                 msg.setData(data);
42 
43                 */
44 
45                 //设置好数据后,发送消息
46                 mHandler.sendMessage(msg);
47             }
48         }).start();
49     }
50 
51 }

当然,handler也可以在子线程中创建,代码如下:

 1   private TextView tv_test;
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.handler_test_layout);
 7 
 8         tv_test= (TextView) findViewById(R.id.tv_test);
 9 
10 
11     }
12 
13     //button点击的函数
14     public void click(View v)
15     {
16         new Thread(new Runnable() {
17             @Override
18             public void run() {
19                 Looper.prepare();
20                 Handler handler=new Handler(Looper.getMainLooper()){
21                     @Override
22                     public void handleMessage(Message msg) {
23                         switch (msg.what)
24                         {
25                             case 1:
26                                 tv_test.setText("receive msg");
27                         }
28                     }
29                 };
30                 Message msg=new Message();
31                 msg.what=1;
32                 handler.sendMessage(msg);
33             }
34         }).start();
35     }

上面的代码是,当点击按钮后,就会创建一个新的线程,在新线程中创建handler,并发送消息、接受消息。这里需要注意的是,在新线程中创建handler需要使用Handler handler=new Handler(Looper.getMainLooper())这样的写法,Looper.getMainLooper()将主线程中的Looper传过去,这样handler才能访问UI。运行效果如下:

 

 

Handler的内部机制

Handler创建时会采用Looper来建立消息循环。所以,当前线程必须要有Looper。当Handler创建完成后,其内部的Looper以及MessageQueue既可以和Handler一起协同工作了。Handler通过sendMessage将消息发送给内部的MessageQueue,而MessageQueue会调用queue.enqueueMessage(msg, uptimeMillis)方法,它的源码如下:

 1 boolean enqueueMessage(Message msg, long when) {
 2         if (msg.target == null) {
 3             throw new IllegalArgumentException("Message must have a target.");
 4         }
 5         if (msg.isInUse()) {
 6             throw new IllegalStateException(msg + " This message is already in use.");
 7         }
 8 
 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • android Handler介绍,androidhandler介绍
  • Android消息机制
  • Android安全机制
  • Android消息机制Handler解析(源码+Demo)
  • android handler传递消息机制,androidhandler
  • Android基于监听的事件处理机制
  • Android消息机制之Handler,androidhandler
  • Android handler 详解(面试百分之100问到),androidhandler

相关文章

  • 2017-05-26Android在onCreate()方法中可以获取到宽高等信息
  • 2017-05-26几个常用的adb命令,常用adb命令
  • 2017-05-26android获取屏幕宽高与获取控件宽高,android获取控件
  • 2017-05-26android:从另外一个activity中返回数据
  • 2017-05-26手机安全卫士——高级工具-电话归属地查询,安全卫士归属地查询
  • 2017-05-26Android代码优化小技巧,android代码小技巧
  • 2017-05-26Android开发笔记(4)——MainActivity.java文件修改&布局嵌套,androidmainactivity
  • 2017-05-26使用Chrome远程调试GenyMotion上的WebView程序,genymotionwebview
  • 2017-05-26TabLayout + ViewPager,tablayoutviewpager
  • 2017-05-26Android--httpclient模拟post请求和get请求分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • android动画详解一 概述
    • Android手机输入法按键监听-dispatchKeyEvent
    • ListView 添加 HeaderView常见错误,listviewheaderview
    • Android 手机卫士8--删除通话记录,android8--
    • Android开发5:应用程序窗口小部件App Widgets的实现,androidwidgets
    • 用Android Studio 运行ndk 程序
    • Android开发必看-快速提高 Android 开发效率的 Web 工具,android必看
    • 浅谈Windows下SVN在Android Studio中的配置和基本使用,svnandroid
    • Android 6.0 运行时权限处理完全解析,android6.0
    • Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面,countdownview倒计时

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有