概述

在Android开发中,有主线程(UI线程)和工作线程(Worker线程)之分,两个线程是相互独立的,并不能相互访问(主线程主要负责UI的更新,不能进行耗时的操作,工作线程主要负责耗时的操作,但不能进行UI的更新),所以要在两个线程之间进行数据传递,就需要Handler作为传递数据的桥梁。每一个Handler对象,都与独立的线程以及线程的消息队列有关。本文仅供学习分享使用。

Handler逻辑

  1. Looper会从消息队列中,将消息对象取出。
  2. Looper会找到Message对象对应的Handler对象。
  3. Looper会调用Handler对象的handleMessage方法,用于处理对象。

涉及知识点

  • Android线程:有主线程(UI线程)和工作线程(Worker线程)
  • Handler 允许发送和处理与线程相关的消息对列的可运行对象。
    • handleMessage (Message msg) 必须在子类进行重写的的处理消息的方法。
    • sendMessage (Message msg) 发送消息方法。
    • obtainMessage () 用于从全局消息池中获取一个新的对象。
  • Message 定义一个用于描述和任意数据对象的消息,此消息可以发送到Handler对象。
    • what 消息对象的标识符。
    • arg1,arg2 用于存储整型数据的值。
    • obj 可以接受任意的对象,用于存储消息的对象的值。
  • Thread 线程是一个可并发执行的单元。重写run方法来处理线程内容。

Handler原理

如下图所示:

核心代码

创建一个内部类继承Handler

  /*
创建一个内部Handler类
*/
class NetworkHandler extends Handler{ @Override
public void handleMessage(Message msg) {
Log.i("DemoHandler", "run: thread id2="+Thread.currentThread().getName());
String s = (String) msg.obj;
txtInfo.setText(s);
}
}

创建一个内部类,继承Thread

   /*
创建一个线程内部类
*/
class NetworkThread extends Thread{
@Override
public void run() {
Log.i("DemoHandler", "run: thread id1="+Thread.currentThread().getName());
//模拟网络获取,当执行时休眠2秒钟
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//通过handler将线程数据,发送到消息队列中
//1. Looper将消息队列中的消息对象取出。
//2. Looper找到消息对象对应的Handler对象
//3. Looper将会调用handler对象中的handleMessage(Msg)方法,处理对象
String s="这是一个线程中的数据";
Message msg=handler.obtainMessage();
msg.what=1;
msg.obj=s;
handler.sendMessage(msg);
}
}

启动线程

  public  void click_me(View v){
//点击事件中启动一个线程
Thread thread=new NetworkThread();
thread.start();
}

调试输出信息(两个分属不同的线程)

 04-25 22:56:37.424 18601-18786/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-4
04-25 22:56:39.425 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main
04-25 22:56:55.491 18601-18800/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-5
04-25 22:56:57.492 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main

备注

大多数情况下,在worker thread中修改view是不可以的,小部分是可以的,如progressbar 。

一起学Android之Handler的更多相关文章

  1. Android精通之Handler讲解

    版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...

  2. 一步一步学android控件(之六) —— MultiAutoCompleteTextView

    今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...

  3. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

  4. Android开发学习之路-该怎么学Android(Service和Activity通信为例)

    在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...

  5. 菜鸟学Android编程——简单计算器《一》

    菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...

  6. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  7. Android 测试Handler的基本使用

    package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...

  8. Android中Handler 、Thread和Runnable之间的关系

    在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...

  9. Android之Handler,举例说明如何更新UI

    方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...

随机推荐

  1. 2016/09/29 Maven简介

    1.1 何为Maven Maven这个词可以翻译为"知识的积累",也可以翻译为"专家"或"内行".作为Apache组织中的一个颇为成功的开源 ...

  2. VS2019 开发Django(十)------JavaScript与Django的数据交互

    导航:VS2019开发Django系列 这一篇介绍如何使用BootStrap Table这个组件来绑定渲染数据, 1)先来看一下BootStrap Table是怎么绑定数据的. 通过数据属性 给定da ...

  3. JSON2ABAPType:根据JSON数据结构生成ABAP类型定义

    一图表明本文将要介绍的工具: JSON是常见的数据格式,经常用于接口开发.ABAP开发者通常使用/ui2/cl_json来把JSON数据转换为相应的ABAP类型. 在转换前,必须要定义相应的ABAP类 ...

  4. iOS开发-APP图标、启动页、名字的设置

    APP图标.启动页.名字的设置:(较全面,但是APP启动页讲述的有漏洞) 参考链接:https://www.jianshu.com/p/2c7e181276ff APP启动页:(弥补上一文的漏洞) 参 ...

  5. Gradle-任务

    任务结果标签 当 Gradle 执行一个任务时,它会在控制台和 Tooling API 根据任务结果给任务打标签. 这些标签是根据任务是否有操作,是否应该执行操作,是否执行了操作以及这些操作做了哪些改 ...

  6. JS中遍历对象属性的四种方法

    Object.keys().Object.values().Object.entries().for...in.Map (1)Object.keys(): let ex1 = {c1: 'white' ...

  7. Java8新特性之接口defualt,static方法

    简介 作用 Java8中接口引入了defualt,static两种方法提供默认实现,彻底打破了接口不能有默认实现的规定 static 让接口类似于工具类,提供一些静态方法 static方法不会被子类继 ...

  8. How to: Use Both Entity Framework and XPO in a Single Application 如何:在单个应用程序中同时使用实体框架和 XPO

    This topic demonstrates how to create a simple XAF application that uses both the Entity Framework ( ...

  9. 获取input type=file 的文件内容(纯文本)

    一.获取input type=file 的文件内容(纯文本) 1.需求一 通过点击其他事件,来触发 文件选择框(限定格式为 .c 文件),而不是手动鼠标点击触发. [思路:] step1:将 inpu ...

  10. druid链接数据库

    所用jar包 commons-beanutils-1.8.0.jarcommons-logging-1.1.3.jardruid-1.0.9.jarmysql-connector-java-5.1.1 ...