Handler背景理解: 

 Handler被最多的使用在了更新UI线程中,但是,这个方法具体是什么样的呢?我在这篇博文中先领着大家认识一下什么是handler以及它是怎么样使用在程序中,起着什么样的作用。

  示例说明:

    首先先建立两个按钮:一个是start按钮,作用是开启整个程序。另一个是终止按钮end,作用是结束整个的程序。这两个按钮的相互对比就会让大家明白Handlerd的基本的工作原理。

运行结果截图:

MainActivity.class

package com.example.testhandler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class MainActivity extends Activity {private Button start,end;//实例化一个handler对象private Handler handler = new Handler();//开启一个新的线程:开启线程有两种方式,一种是使用普通的Thread方法,另一个中是使用Runnable方法Runnable update = new Runnable() {@Overridepublic void run() {System.out.println("update");handler.postDelayed(update, 3000);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);start = (Button)this.findViewById(R.id.btn_start);end = (Button)this.findViewById(R.id.btn_end);start.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//加入到队列中去执行handler.post(update);}});end.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//将消息移除队列中去handler.removeCallbacks(update);}});}}

  当点击Start按钮时的效果图如下:

当点击end按钮时的效果图如下:

注意:

  Handler中的post方法并没有开启一个新的线程,他的操作是在主线程中执行的。下面咱们就来验证一下这个观点。

  首先先贴一下运行截图:

  

  等过10s之后的运行结果是:

  

这里只是测试一下handler的post()方法是否是在主线程中进行的。所以没有布局。

设计思路:

在主线程中输出主线程当前的ID和Name,然后使用Runnable方式新建一个线程,在这个新线程中让程序睡眠10s,将这个线程使用Handler的post()方法发送到主线程中,看是否是执行异步加载。也就是验证handler是否是异步加载方式。结论:Handler不是异步加载方式。

MainActivity:

package com.example.handlertest1;import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;public class MainActivity extends Activity {private Handler mhandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//将多线程发送到消息队列中mhandler.post(r);//不会立刻加载界面,这说明了handler并不是开辟了一个新的线程而是在主线程中进行的。setContentView(R.layout.activity_main);System.out.println("Activity-->"+Thread.currentThread().getId());System.out.println("Activity-->"+Thread.currentThread().getName());}Runnable r = new Runnable() {public void run() {System.out.println("Handler--->"+Thread.currentThread().getId());System.out.println("handler--->"+Thread.currentThread().getName());try {Thread.sleep(10000);} catch (Exception e) {e.printStackTrace();}}};}

LogCat文件的输出:

 

在这里通过ID号很明显的看出这不是执行的是多线程加载

在上面的主线程中重新新建一个线程则实现了多线程的加载:

将上面的onCreate()中的代码替换为:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//将多线程发送到消息队列中
//        mhandler.post(r);//不会立刻加载界面,这说明了handler并不是开辟了一个新的线程而是在主线程中进行的。
        setContentView(R.layout.activity_main);//这是另外开启了一个新的线程,会发现这里输出的速率会比上次的快很多Thread t = new Thread(r);t.start();System.out.println("Activity-->"+Thread.currentThread().getId());System.out.println("Activity-->"+Thread.currentThread().getName());}

效果截图如下:

LogCat文件中的输出结果截图为:

在这里通过ID号很明显的看出了这是执行了多线程加载。

  Handler要想开辟一个新的线程需要使用HanderThread()方法。下面就是HandlerThread()的用法:

设计思路:

  通过使用handler方法传输数据,然后使用HandlerThread,实现了使用Looper来处理消息队列的功能。输出当前的Activity的ID和Name,以及Handler的ID和Name以及传输的数据

代码如下:

 1 package com.example.handlertest1;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.os.HandlerThread;
 7 import android.os.Looper;
 8 import android.os.Message;
 9
10 public class HandlerTest2 extends Activity{
11
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16
17         //打印当前线程的ID和当前线程的名字
18         System.out.println("Activity-->"+Thread.currentThread().getId());
19         System.out.println("Activity-->"+Thread.currentThread().getName());
20
21         //HandlerThread是以键值对的形式进行存储的,这里的handler_thread就是该handler的键名
22         //生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能。这是有android来提供的并不是java中的Thread提供
23         HandlerThread handlerthread = new HandlerThread("handler_thread");
24         handlerthread.start();
25         MyHandler myhandler = new MyHandler(handlerthread.getLooper());
26         Message msg = myhandler.obtainMessage();
27         //传送多的数据的时候使用的setData()方法,使用Bundle()将数据包装
28         Bundle b = new Bundle();
29         b.putInt("age", 20);
30         b.putString("name", "张三");
31         msg.setData(b);
32         //将消息发送给目标,目标就是生成该msg对象的handler
33         msg.sendToTarget();
34
35     }
36
37     class MyHandler extends Handler{
38
39         public MyHandler(){
40
41         }
42         public MyHandler(Looper looper){
43             super(looper);
44         }
45
46         @Override
47         public void handleMessage(Message msg) {
48             Bundle b = msg.getData();
49             int age = b.getInt("age");
50             String name = b.getString("name");
51             System.out.println("age is"+age+",name"+name);
52             System.out.println("Handler--->"+Thread.currentThread().getId());
53             System.out.println("Handler--->"+Thread.currentThread().getName());
54             System.out.println("handlermessage");
55         }
56
57     }
58
59 }

好了,就这么多了,具体的关于Handler、Looper、Message三者的关系,参考http://blog.csdn.net/lmj623565791/article/details/38377229个人感觉不错

转载于:https://www.cnblogs.com/bingbingliang-xiaomonv/p/5462685.html

Android之Handler探索相关推荐

  1. Android开发艺术探索——第七章:Android动画深入分析

    Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类 ...

  2. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

  3. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  4. Android多线程(Handler篇)

    [齐天的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qijinglai/article/details/80685226 关联文章: Android多线程(Han ...

  5. Android开发艺术探索2

    Android开发艺术探索2 该系列文章为<Android开发艺术探索>读书笔记,仅作为学记录,勿喷. Android IPC简介 IPC是Inter-Process Communicat ...

  6. Android开发艺术探索——新的征程,程序人生路漫漫!

    Android开发艺术探索--新的征程,程序人生路漫漫! 偶尔写点东西分享,但是我还是比较喜欢写笔记,看书,群英传看完了,是学到了点东西,开始看这本更加深入Android的书籍了,不知道适不适合自己, ...

  7. 《Android 开发艺术探索》笔记2--IPC机制

    <Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...

  8. android的Handler

    android的Handler 前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进行量 ...

  9. Android 开发艺术探索 看不懂对着书敲慢慢理解,设计模式之禅总结,平时记录的笔记,3w多次字防止丢失,留存。

    知识点1: 1.子线程为什么不允许访问ui因为android中的ui控件不是线程安全的. 2.为什么不给Ui加上锁的机制,第一点 会让ui访问的逻辑变得复杂,其次降低ui访问的效率. 3.List转化 ...

最新文章

  1. 【笔记】SFTP、ssh密钥连接远程服务器,putty工具生成密钥,详细图文教程
  2. 项目: 实现弹跳小球动画
  3. 关键字回顾(final/finally/finalize()、Synchronized、volatile、static)
  4. c#读取string类型的xml格式的字符串
  5. python pandas csv 追加 空行,python – Pandas:read_csv在空行后忽略行
  6. stack vs heap:栈区分配内存快还是堆区分配内存快 ?
  7. PureFTP安装配置
  8. STM32(十一)- 串行FLASH文件系统FatFs
  9. Illustrator 教程,如何在 Illustrator 中添加图像?
  10. 遗传算法实例(matlab编程实现)
  11. 2021-11-15求积分面积和旋转体积的二重积分方法
  12. 如何成为牛逼的程序员
  13. 考虑储能削峰填谷的含DG配电网可靠性评估
  14. JSP与JavaBeans
  15. 【CSS】955- 你该知道的字体 font-family
  16. JS中(function(){xxx})(); 这种写法是什么意思?
  17. 韩信点兵--求分数序列前N项和--特殊a串数列求和--猜数字游戏
  18. c语言编码数字的范围,C语言数据类型的表示范围
  19. java 约瑟夫单循环_约瑟夫问题(Josephus问题)的递推O(n)解法、循环解法、单循环链表解法 | 学步园...
  20. linux 内存管理 (一) 基本的一些概念

热门文章

  1. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
  2. 图像和流媒体 -- Sapera 安装遇到的问题
  3. CSDN-markdown编辑器使用方法
  4. 跨链资产原子转移工具包 Decred atomicswap
  5. Double Free浅析
  6. 怎么钢枪_这样玩《和平精英》有手就能上皇冠?教你玩吃鸡怎么涨KD
  7. python类的应用_Python · 元类(Meta Class)及其应用
  8. bootstrap 开源框架demo_高大上的开源Springboot企业级用户权限系统
  9. JZOJ 1219. Num
  10. 思科UCS服务器怎么安装系统,安装Redhat/CentOS操作系统在UCS M系列服务器