0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Android中Handler的作用和使用方法

public class Handler extends Object A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue. There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own. Handler的基本概念

包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙。

创建一个Handler对象

Handler handler = new Handler();

将要执行的操作写在线程对象的run方法当中

Runnable updateThread = new Runnable(){
public void run(){
handler.postDelayed(updateThread,3000);
}
}

一个点击监听事件,在handler中添加要执行的线程

Class StartButtonListener implements OnClickListener{
public voidonClick(View v){
//调用Handler的post方法,将要执行的线程对象添加到队列中
handler.post(updateThread);
}
}

一个点击监听事件,在handler中把线程移除

Class EndButtonListerger implements OnClickListener(){
public void onClick(View v){
handler.removeCallBacks(updateThread);
}
}

使用Handler更新ProgressBar的方法

分别使用 updateBarHandler.post(updateThread); updateBarHandler.sendMessage(msg); 传递线程和消息。 通过Handler的handleMessage()方法处理消息。 首先使用匿名内部类来复写Handler当中的handlerMessage方法,该方法用于接收消息

Handler updateBarHandler = new Handler(){
public void handleMessage(Message msg){
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}
};

创建一个线程类,用于控制进度条的进度,该类使用匿名内部类的方式进行声明

Runnable updateThread = new Runnable(){
int i = 0;
public void run(){
i = i + 10;
Message msg = updateBarHandle.obtainMessage();
msg.arg1 = i;
try{
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrack();
}
//将msg对象加入到消息队列
updateBarHandler.sendMessage(msg);
if( i == 100){
updateBarHandler.removeCallbacks(updateThread);
}
}
}

点击按钮事件,加入队列,启动线程

class ButtonListener implements OnClickListener{
public void onClick(View v){
bar.setVisibility(View.VISIBLE);
//线程队列
updateBarHandler.post(updateThread);
}
}

Handler中使用单独的线程

需要使用public Handler (Looper looper) 构造函数创建Handler对象。从而实现使用Looper来处理消息队列的功能。借助Bundle使用Message传递数据。 当使用 handler.post(new Runnable); 时Handler和Activity处于同一个线程当中,在同一个线程中调用run方法。 而使用 Thread t = new Thread(new Runnable()); t.start(); 创建的线程和Activity处于不同的线程中 Bundle的用法 可以把Bundle看成是特殊的map,所有的key都是String类型的 在新线程当中处理消息的方法

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//打印当前线程的ID
System.out.println(Thread.currentThread().getId());
//生成一个HandlerThread对象,实现了Looper来处理消息队列的功能,这个类由android应用框架提供
HandlerThread handlerThread = new HandlerThread("hanlderThread");
//必须先调用该类的start的方法,否则该获取的Looper对象为NULL
handlerThread.start();
MyHanlder myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString("name","arthinking");

    msg.setData(b);
msg.sendToTarget();

}

class MyHandler extends Handler{
public MyHandler(){}
public MyHandler(Looper looper){
super(looper);
}
//每当有消息进入消息队列时就执行这个函数对消息进行操作
public void handleMessage(Message msg){
Bundle bundle = msg.getData();
String name = bundle.getString("name");

        System.out.println(Thread.currentThread().getId());
        System.out.println(name);
    }

}

(特别说明:本文部分内容是在观看marschen的Android视频教程时摘抄的笔记,感谢marschen推出的视频教程,这里也推荐给大家:http://www.marschen.com/portal.php)

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法