使用 Handler 机制,首先需要创建一个Handler 对象,可以直接使用Handler 无参构造函创建Handler 对象,或者是继承Handler类,重写 handleMessage(Message msg)方法来创建handler对象。Google 官方提供了一个推荐的使用方式,代码如下∶

Class LooperThread extends Thread {
public Handler mHandler;
public void run()
{Looper.prepare();
mHandler = new Handler(){
public void handleMessage(Message msg){
// process incoming messages here
}
};
Looper.loop();
}
}

通过上一部分的分析,读者应该能够很容易理解上面这种方式。但是在实际的开发实践中,大部分的Handler 对象都是在主线程中创建的,此时已经存在了Looper 对象,并不需要调用Loopr.prepare()与 Looper.loop()方法,直接构建一个Handler 对象即可∶

private Handler mHandler = new Handler() {
public void handleMessage(Message msg)
{// process incoming messages here
}
};

这里我们使用Handler的sendMessage(Message msg)方法来发送消息,并使用handleMessage(Message msg)方法来接收消息,在布局代码中加入两个按钮,与两个TextView,当程序运行10秒修改TextView的内容,布局文件activity_main.xml代码如下:

<?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=".MainActivity"><Buttonandroid:id="@+id/bind_service"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="绑定服务"android:textSize="25dp"/><Buttonandroid:id="@+id/unbind_service"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="解绑服务"android:textSize="25dp"/><TextViewandroid:id="@+id/textview"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="无数据"android:textSize="25dp"/><TextViewandroid:id="@+id/handler_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="handler"android:textSize="25dp"/>
</LinearLayout>

我们创建MyService类继承自Service,Myservice代码如下:

package com.rfstar.handlertest;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class MyService extends Service {private String message;private IBinder binder = new MyBinder();private MyService.ServiceThread serviceThread=new MyService.ServiceThread();private Thread thread;@Overridepublic IBinder onBind(Intent intent) {Log.i("service", "onBind");// serviceThread = new ServiceThread();thread = new Thread(serviceThread);//开启一个线程thread.start();/**返回一个可以在Activity的onServiceConnected()方法中接收到的binder对象* 它是Activity和Service通信的桥梁* 在Activity中通过这个bind对象可以得到Service的实例引用* 通过获取的Service实例就可以调用相关方法和属性*/return binder;}@Overridepublic void onCreate() {Log.i("service", "onCreate");super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("service", "onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic boolean onUnbind(Intent intent) {Log.i("service", "onUnbind");return super.onUnbind(intent);}@Overridepublic void onDestroy() {super.onDestroy();//结束run方法的循环serviceThread.flag = false;Log.i("service", "onDestroy");}class ServiceThread implements Runnable {//用volatile修饰保证变量在线程间的可见性volatile boolean flag = true;@Overridepublic void run() {Log.i("service", "thread 开始运行");int i = 1;while (flag) {if (mOnDataCallback != null)//通过线程模拟真实场景,循环改变数据{mOnDataCallback.onDataChange(message + i);}i++;try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public class MyBinder extends Binder{public void setData(String message){//从Activity传入message值MyService.this.message=message;}public MyService getService(){/*** 返回当前MyService对象* 当Activity中获取binder类的实例后* 可以通过此方法获取Service类实例*/return MyService.this;}}private OnDataCallback mOnDataCallback=null;public void setOnDataCallback(OnDataCallback mOnDataCallback){this.mOnDataCallback=mOnDataCallback;}public interface OnDataCallback{void onDataChange(String message);}
}

然后再在AndroidManifest.xml文件中配置service,一定不要忘记这一步,否则工程运行不了。

在Activity中,创建Handler,并使用Handler发送消息,代码如下:

package com.rfstar.handlertest;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button bindService;private Button unbindService;private TextView textView;private TextView handlderText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {bindService=(Button)findViewById(R.id.bind_service);unbindService=(Button)findViewById(R.id.unbind_service);textView=(TextView)findViewById(R.id.textview);handlderText=(TextView)findViewById(R.id.handler_text);bindService.setOnClickListener(this);unbindService.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.bind_service://创建意图Intent bindIntent=new Intent(this,MyService.class);//绑定服务bindService(bindIntent,serviceConnection, Context.BIND_AUTO_CREATE);break;case R.id.unbind_service://创建意图Intent unbindIntent=new Intent(this,MyService.class);//解绑服务unbindService(serviceConnection);break;}}@Overrideprotected void onDestroy(){super.onDestroy();unbindService(serviceConnection);}
private MyService.MyBinder myBinder;private MyService myService;public ServiceConnection serviceConnection=new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {//得到binder实例myBinder=(MyService.MyBinder)iBinder;//给Service中的message设置一个值myBinder.setData("MainActivity:");//得到Service实例myService=myBinder.getService();//设置接口回调获取Service中的数据myService.setOnDataCallback(new MyService.OnDataCallback() {@Overridepublic void onDataChange(final String message) {if(message.equals("MainActivity:"+10)){Bundle bundle=new Bundle();bundle.putString("name","大鸟科创空间");Message msg1=mHandler.obtainMessage();msg1.setData(bundle);msg1.what=1;msg1.arg1=6;mHandler.sendMessage(msg1);}else if(message.equals("MainActivity:"+20)){mHandler.sendEmptyMessage(2);}else{mHandler.post(new Runnable() {@Overridepublic void run() {textView.setText(message);}});}}});}@Overridepublic void onServiceDisconnected(ComponentName componentName) {myService=null;}};private Handler mHandler=new Handler(){public void handleMessage( Message msg) {switch (msg.what){case 1:String name=(String)msg.getData().get("name");int age=msg.arg1;handlderText.setText(name+"的年龄为:"+age);break;case 2:Toast.makeText(MainActivity.this,"发送的一个空的Message",Toast.LENGTH_LONG).show();break;}}};
}

这里分别使用 mHandler.sendMessage(msg1)、mHandler.sendEmptyMessage(2)两种方式来送消息,并在 handleMessage(Message msg)中用 switch(msg.what) 来分别获取。同时还用了mhandler.post(new Runnable(){})这样一个与 runOnUiThread(Thread thread)同样效果的方法。Handler 的其他几个方法与上述3种用法一致,稍加改动就可以使用,此处不再叙述。运行程序,绑定服务之后,当第 10秒之后可以看到 TextView 的值被修改,如图1-1所示第20秒之后,Toast 出现,效果如图1-2所示。

图1-1使用sendMessage发送方法

图1-2使用post方法发送消息

源码下载地址:链接:https://pan.baidu.com/s/1ExoSxaQRdjmwUUnDuSbUIQ 提取码:43ka

Android之Handler机制使用实例相关推荐

  1. Android面试——Handler 机制

    Android面试--Handler 机制 一.Handler机制 Handler机制围绕的三个点 1.Handler负责消息的发送和接受 发送给消息MessageQueue和接受Looper返回的消 ...

  2. 自己写个C++版本Handler来理解Android的Handler机制

    由于日常工作不需要经常写android上层应用,对Android的Handler机制一直处于模模糊糊的状态.使用Handler之后,回去写c++代码时,时刻怀念Android里面的Handler,希望 ...

  3. (转)Android笔记--handler机制

    一.重要参考资料 [参考资料] 目前来看,下面的几个网址中的内容质量比较不错,基本不需要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye.com/blog/ ...

  4. android中handler机制,如何使用?,Android中的Handler机制

    一.Handler概述 二.Handler发送消息的方法 三.MessageQueue的enqueueMessage() 四.Message的when字段 五.子线程中使用Handler 六.Loop ...

  5. 【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )

    文章目录 I . Handler 机制简介 II . Handler 机制 Handler Message Looper MessageQueue 四组件对应关系 III . Handler ( 消息 ...

  6. [转]Android中handler机制的原理

    Andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...

  7. android handler的机制和原理_第一百八十回:Android中的Handler机制九

    各位看官们大家好,上一回中咱们说的是Android中Handler机制的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起Talk Android吧! 看官们,由于时间的原因我们在上一回中只 ...

  8. Android消息机制(Handler机制) - 线程的等待和唤醒

    我们都知道,Android的Handler机制,会在线程中开启消息循环,不断的从消息队列中取出消息,这个机制保证了主线程能够及时的接收和处理消息. 通常在消息队列中(MessageQueue)中没有消 ...

  9. Android:Handler的消息机制

    前言 Android 的消息机制原理是Android进阶必学知识点之一,在Android面试也是常问问题之一.在Android中,子线程是不能直接操作View,需要切换到主线程进行.那么这个切换动作就 ...

  10. Android多线程:深入分析 Handler机制源码(二)

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义 一套 Android 消 ...

最新文章

  1. Vue精简版风格指南
  2. 优化asp.net ajax的脚本资源下载
  3. php逗号为什么比点号快,[PHP]
  4. 采用傅立叶变换空间载波法从强度分布得到相位分布,即从空间上呈正弦分布的光强信息,恢复出波面的相位信息
  5. 刷新纪录 | 74.7 秒训练完 ImageNet!2048 GPU 暴力出奇迹
  6. centos 7 mysql图形界面_centos7-vnstat图形界面搭建
  7. memset()、memcpy()、memcmp()的使用方法
  8. 华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机
  9. linux导出Mysql数据sql脚本
  10. async和await浅析
  11. MULTISIM下载安装
  12. 网站关键词密度多少会比较合适?
  13. Beer Barrels
  14. 武威市教师职称计算机考试,关于高级教师职称评定述职报告(精选5篇)
  15. QT 多显示屏获取屏幕分辨率
  16. 18-EMM Procedure 6. Handover without TAU - Part 3. S1 Handover
  17. 2012计算机科学排名,USNEWS2012年计算机科学专业研究生排名
  18. 什么是Promise,Promise的三种状态,Promise的方法
  19. 浅谈矩阵 矩阵快速幂 动态dp 矩阵求逆
  20. 百度朱光:将技术基因注入百度金融,是我们未来三五年要做的事

热门文章

  1. RTKLIB专题学习(八)—卫星星历和钟差
  2. VMware Workstation16安装
  3. bp神经网络算法matlab程序,bp神经网络的matlab实现
  4. Networkx参考手册
  5. iOS捷径(Workflow 2.0)拓展
  6. linux开启防火墙教程,linux系统开启防火墙及开放端口操作步骤
  7. linux安装时找不到硬盘分区,在安装linux时出现找不到硬盘如何解决
  8. 最新 CCF A 类人工智能会议论文下载汇总 (含2022)
  9. html中加入透明flash
  10. 万兆网络传输速度测试_Intel万兆网卡的真实测试万兆速度的方法