Handler的作用与用法
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的对象
what属性:
int类型,主线程用来识别子线程发来的是什么消息。arg1属性:
int类型,如果传递的消息类型为int型,可以将数字赋给arg1,arg2。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的作用与用法相关推荐
- PreTranslateMessage作用和用法
PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗体的消息都要通过这里,比較经常使用,当 ...
- java package作用_java import、package作用与用法
java import.package作用与用法 有些人写了一阵子Java,可是对於Java 的package 跟import 还是不太了解很多人以為原始码 .java 档案中的import 会让编译 ...
- MySQL数据类型中DECIMAL的作用和用法
在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮 ...
- php中pre标签,html中pre标签与code标签的作用与用法
HTML 标签 定义和用法 pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. 标签的一个常见应用就是用来表示计算机的源代码. 可以导致 ...
- PHP中的常见魔术方法功能作用及用法实例
这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...
- android handler作用,3.2.4 Handler的作用
3.2.4 Handler的作用 根据Handler处理Message消息相关特性和前面的实例,可以得出这样的结论:Handler主要作用是异步处理较费时的逻辑,优先将界面返回给用户,异步处理完成后再 ...
- 、简述global关键字的作用_在C#编程中global关键字的作用及其用法
在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...
- chrome中Blackbox Script 黑盒脚本作用及用法
chrome中Blackbox Script 黑盒脚本作用及用法 Blackbox Script功能 每天前端人员在调试代码的时候,都可能会遇到代码调试着会进入第三方库文件,带来很多没必要的调试,不方 ...
- C#中using关键字的作用及其用法(转)
C#中using关键字的作用及其用法 using的用途和使用技巧. using关键字微软MSDN上解释总共有三种用途: 1.引用命名空间. 2.为命名空间或类型创建别名. ...
最新文章
- 排序算法时间复杂度分析
- 如何给屏幕设置一个充满全屏的图片
- oracle错误12518,ORA-12518: 错误 客户端连接不上
- spark发行版笔记9
- [css] 使用css画出一个五角星
- python创建虚拟环境时出现拒绝访问_无法创建虚拟环境
- 摄像头安装说明_老司机告诉你马路上不同摄像头有不同作用,注意区分小心扣分...
- java php cms_内容管理系统的开发策略研究——以PHP CMS、Node.js CMS、Java CMS为例
- zend studio7 在 ubuntu9.10 中按钮失效只能用回车解决办法
- Redis下载安装 windows版本
- MATLAB去除人声
- 关于腾讯云学生服务器搭建个人网站——配置web开发环境详细步骤
- Win7各正式版下载地址和SHA验证
- 如何删除计算机中常用列表,清除右键多余菜单,鼠标右键菜单清理的方法(一) -电脑资料...
- 摄影构图学pdf_初学摄影,怎样避免走太多弯路?(2)
- 【便签纸】记录一下对比excel列表的小工具代码
- “书法字”“一”的理解
- RuoYi(若依)平台页面缓存无效
- 大白菜装机教程win10_装机吧教你没有光盘的情况下:如何重装系统
- yum -- Failed connect to mirrors.aliyuncs.com:80; No route to host