1.什么是handler?

Handler是Android SDK来处理异步消息的核心类。
子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。

2.什么是MessageQueue和Looper


如图MessageQueue用来保存子线程从Handler所发送未处理的消息,Looper依次取出MessageQueue中的消息传递给主线程响应处理。

3.为什么使用handler,MessageQueue,Looper?

主线程无法进行时间比较繁长的任务,所以需要子线程进行处理,然而子线程无法进行UI的界面更新,所以我们需要使用handler来传递消息给主线程,让其完成UI的更新。由于主线程和子线程进行不同的时间工作,所要需要用MessageQueue来存放子线程的消息,Looper取出消息交给主线程响应。

4.使用handler的主要步骤

主要步骤分为三布:
1.首先创建好handler.

private  Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}};

从子线程中发出消息

                         Message message=handler.obtainMessage();message.what=1;message.arg1=i;message.obj="倒计时:";handler.sendMessage(message);

在handler中捕获所需消息,实现响应

  private  Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int arg1=msg.arg1;String info= (String) msg.obj;if (msg.what==1){textView.setText(info+arg1);}if (arg1==0){textView.setText("完成");}}};

5.Message的对象

  1. what属性:
    int类型,主线程用来识别子线程发来的是什么消息。

  2. arg1属性:
    int类型,如果传递的消息类型为int型,可以将数字赋给arg1,arg2。

  3. obj属性:
    Objectt类型,如果传递的消息是String或者其他,可以赋给obj。

                        message.what=1;//what属性message.arg1=i;//arg属性message.obj="倒计时:";//obj属性handler.sendMessage(message);if (msg.what==1)//识别判断消息{textView.setText(info+arg1);}

6.使用Handler和线程制作简单的计时器

首先创建好Activity并完善好Activity的布局文件,做好响应的控件和ID

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.wang3.myapplication.ThreadActivity"><LinearLayout
    android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextView
    android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="输入计时时间:"android:textSize="20sp"/><EditText
        android:id="@+id/theradedtext"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入数字"android:numeric="integer"/>
</LinearLayout><View
        android:layout_width="match_parent"android:layout_height="1dp"android:background="#000"/><TextView
        android:id="@+id/theradtext"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="倒计时:**"android:textSize="20sp"android:gravity="center"/><Button
        android:id="@+id/theradbtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:layout_gravity="center"android:gravity="center"android:text="开始计时"/></LinearLayout>

在Activity中绑定好我们所创的控件Id ,为了实现按钮点击开始计时,我们还需要设置按钮的监听。

 private Button button;private TextView textView;private EditText editText;
 private void BlindID() {button=findViewById(R.id.theradbtn);textView=findViewById(R.id.theradtext);editText=findViewById(R.id.theradedtext);button.setOnClickListener(this);}

时间倒计时我们需要用子线程来通过Handler来传递时间的变化,主线程获取响应,所以要先创建好Handler

private  Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}};

设置好监听事件,我们需要从EditText中获取所要设定的时间,所以创建int型来获取存放用户所输入的数字,将显示的Textview设置为倒计时+数字,利用for循环来改变数字,并创建一个新子线程来实现读秒,让子线程睡上一秒后发送新的信息。

    private int num1;private String num;
 public void onClick(View view) {switch (view.getId()){case R.id.theradbtn:num=editText.getText().toString();num1=Integer.parseInt(num);textView.setText("倒计时:"+num1);new Thread(new Runnable() {@Overridepublic void run() {for (int i=num1;i >=0;i--) {try {Thread.sleep(1000);//实现读秒} catch (InterruptedException e) {e.printStackTrace();}Message message=handler.obtainMessage();message.what=1;message.arg1=i;message.obj="倒计时:";handler.sendMessage(message);//发送信息}}}).start();break;}}

之后再主线程中捕获消息,响应设置TextView的更新,实现每隔一秒改变数字,完成一个计时的简单功能

   private  Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int arg1=msg.arg1;String info= (String) msg.obj;if (msg.what==1){textView.setText(info+arg1);}if (arg1==0){textView.setText("完成");}}};

下面是全部代码:

package com.example.wang3.myapplication;import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class ThreadActivity extends AppCompatActivity implements View.OnClickListener {private Button button;private TextView textView;private EditText editText;private int num1;private String num;private  Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);int arg1=msg.arg1;String info= (String) msg.obj;if (msg.what==1){textView.setText(info+arg1);}if (arg1==0){textView.setText("完成");}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_thread);BlindID();}private void BlindID() {button=findViewById(R.id.theradbtn);textView=findViewById(R.id.theradtext);editText=findViewById(R.id.theradedtext);button.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.theradbtn:num=editText.getText().toString();num1=Integer.parseInt(num);textView.setText("倒计时:"+num1);new Thread(new Runnable() {@Overridepublic void run() {for (int i=num1;i >=0;i--) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}Message message=handler.obtainMessage();message.what=1;message.arg1=i;message.obj="倒计时:";handler.sendMessage(message);}}}).start();break;}}
}

以及效果图:

Handler的作用与用法相关推荐

  1. PreTranslateMessage作用和用法

    PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗体的消息都要通过这里,比較经常使用,当 ...

  2. java package作用_java import、package作用与用法

    java import.package作用与用法 有些人写了一阵子Java,可是对於Java 的package 跟import 还是不太了解很多人以為原始码 .java 档案中的import 会让编译 ...

  3. MySQL数据类型中DECIMAL的作用和用法

    在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮 ...

  4. php中pre标签,html中pre标签与code标签的作用与用法

    HTML 标签 定义和用法 pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. 标签的一个常见应用就是用来表示计算机的源代码. 可以导致 ...

  5. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

  6. android handler作用,3.2.4 Handler的作用

    3.2.4 Handler的作用 根据Handler处理Message消息相关特性和前面的实例,可以得出这样的结论:Handler主要作用是异步处理较费时的逻辑,优先将界面返回给用户,异步处理完成后再 ...

  7. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法

    在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...

  8. chrome中Blackbox Script 黑盒脚本作用及用法

    chrome中Blackbox Script 黑盒脚本作用及用法 Blackbox Script功能 每天前端人员在调试代码的时候,都可能会遇到代码调试着会进入第三方库文件,带来很多没必要的调试,不方 ...

  9. C#中using关键字的作用及其用法(转)

    C#中using关键字的作用及其用法 using的用途和使用技巧.     using关键字微软MSDN上解释总共有三种用途:     1.引用命名空间.     2.为命名空间或类型创建别名.    ...

最新文章

  1. 排序算法时间复杂度分析
  2. 如何给屏幕设置一个充满全屏的图片
  3. oracle错误12518,ORA-12518: 错误 客户端连接不上
  4. spark发行版笔记9
  5. [css] 使用css画出一个五角星
  6. python创建虚拟环境时出现拒绝访问_无法创建虚拟环境
  7. 摄像头安装说明_老司机告诉你马路上不同摄像头有不同作用,注意区分小心扣分...
  8. java php cms_内容管理系统的开发策略研究——以PHP CMS、Node.js CMS、Java CMS为例
  9. zend studio7 在 ubuntu9.10 中按钮失效只能用回车解决办法
  10. Redis下载安装 windows版本
  11. MATLAB去除人声
  12. 关于腾讯云学生服务器搭建个人网站——配置web开发环境详细步骤
  13. Win7各正式版下载地址和SHA验证
  14. 如何删除计算机中常用列表,清除右键多余菜单,鼠标右键菜单清理的方法(一) -电脑资料...
  15. 摄影构图学pdf_初学摄影,怎样避免走太多弯路?(2)
  16. 【便签纸】记录一下对比excel列表的小工具代码
  17. “书法字”“一”的理解
  18. RuoYi(若依)平台页面缓存无效
  19. 大白菜装机教程win10_装机吧教你没有光盘的情况下:如何重装系统
  20. yum -- Failed connect to mirrors.aliyuncs.com:80; No route to host

热门文章

  1. 一个亚马逊精品公司对于运营的要求和流程是怎样的
  2. 类(Class)和实例(Instance)
  3. windows11更新后出现的需要使用新应用以打开windowsdefender问题
  4. 安卓微信7.0.12内测更新!快来看看都更新了什么?
  5. 安装 Metrics server
  6. HTML中的form表单及其提交原理
  7. 应届毕业/临时访深码工深圳居住计划
  8. 2010考研数学二第(10)题——导数应用渐近线
  9. 使用服务器串口线连接到PC端的COM口
  10. 2020-10-17修改xml文件内容