Android知识梳理:消息机制之Handler
程序员文章站
2022-07-14 15:06:06
...
Android知识梳理:消息机制之Looper
http://gqdy365.iteye.com/blog/2137494
一、Handler类在源码的android.os包下面,它主要用于消息的发送和处理,注意:这里的消息可以是线程,即:Handler可以处理普通消息和含有线程的消息。
1、普通消息处理:
sendEmptyMessage发送一个空消息,即没有消息数据;最终在Handler类里面都是调用了系统的sendMessageDelayed方法;
2、线程处理:
3、带有Delayed或AtTime后缀的方法:
这一类方法在Handler中最终都是统一按AtTime进行执行,具体处理方式:
二、Handler的创建:
1、构造方法有四个:
2、一般实现形式:
在实例化Handler时系统会提示:
The following Handler class should be static or leaks might occur
意思是说:Handler应该定义为静态的,否则可能会有泄漏产生;
具体是这样的:
[b]解释:同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。这为什么会产生呢?因为MessageQueue是阻塞式的,即:一个处理完才处理下一个,如果你MessageQueue中有一些延时的操作,整个MessageQueue的生命周期就很长,可能超过了定义Handler所在的Service和Activity的生命周期;[/b]
三、消息处理:
还记得在Android知识梳理:消息机制之Looper(http://gqdy365.iteye.com/blog/2137494)中说的,Looper会不停的调用dispatchMessage给Handler分发消息,那最终还是调用了Handler的handleMessage方法处理消息,而handleMessage是有我们程序员重写的方法。
[b]到这儿,Handler基本搞清楚,是不是感觉Handler很绕,通过Handler把Message发给系统,系统最后有调用我们写的handleMessage方法把消息传过来,让我们处理,这不瞎折腾嘛?
个人理解:由系统统一封装、排队、分发消息;
[/b]
http://gqdy365.iteye.com/blog/2137494
一、Handler类在源码的android.os包下面,它主要用于消息的发送和处理,注意:这里的消息可以是线程,即:Handler可以处理普通消息和含有线程的消息。
1、普通消息处理:
mHandler.sendMessage(Message msg);
mHandler.sendEmptyMessage(int msg.what);
sendEmptyMessage发送一个空消息,即没有消息数据;最终在Handler类里面都是调用了系统的sendMessageDelayed方法;
2、线程处理:
mHandler.post(Runnable r);
3、带有Delayed或AtTime后缀的方法:
这一类方法在Handler中最终都是统一按AtTime进行执行,具体处理方式:
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
二、Handler的创建:
1、构造方法有四个:
public Handler(){}
public Handler(Callback callback) {}
public Handler(Looper looper) {}
public Handler(Looper looper, Callback callback){}
2、一般实现形式:
static Handler mHandler = new Handler(Looper.getMainLooper()) {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
Log.i(TAG, "--方法一:实例化Handler--");
break;
}
};
};
static Handler mHandler1 = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 0:
Log.i(TAG, "--方法二:添加回调接口--");
break;
}
return false;
}
});
static class MainHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
Log.i(TAG, "--方法三:集成Handler类,覆盖handleMessage方法--");
break;
}
}
}
在实例化Handler时系统会提示:
The following Handler class should be static or leaks might occur
意思是说:Handler应该定义为静态的,否则可能会有泄漏产生;
具体是这样的:
if (FIND_POTENTIAL_LEAKS) {
final Class<? extends Handler> klass = getClass();
if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
(klass.getModifiers() & Modifier.STATIC) == 0) {
Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
klass.getCanonicalName());
}
}
[b]解释:同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。这为什么会产生呢?因为MessageQueue是阻塞式的,即:一个处理完才处理下一个,如果你MessageQueue中有一些延时的操作,整个MessageQueue的生命周期就很长,可能超过了定义Handler所在的Service和Activity的生命周期;[/b]
三、消息处理:
还记得在Android知识梳理:消息机制之Looper(http://gqdy365.iteye.com/blog/2137494)中说的,Looper会不停的调用dispatchMessage给Handler分发消息,那最终还是调用了Handler的handleMessage方法处理消息,而handleMessage是有我们程序员重写的方法。
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
[b]到这儿,Handler基本搞清楚,是不是感觉Handler很绕,通过Handler把Message发给系统,系统最后有调用我们写的handleMessage方法把消息传过来,让我们处理,这不瞎折腾嘛?
个人理解:由系统统一封装、排队、分发消息;
[/b]
上一篇: 看了《墨攻》,感觉还不错
推荐阅读
-
android的消息处理机制(图文+源码分析)—Looper/Handler/Message
-
android线程消息机制之Handler详解
-
Android Handler之消息循环的深入解析
-
Android消息处理机制Looper和Handler详解
-
Android Studio 之 Android消息机制 之简单Demo --- 使用Handler和Message类来完成消息传递
-
Handler消息机制知识点梳理
-
Android技术点记录-handler消息传递机制
-
Android必备知识点之View及View的事件分发机制
-
Android消息机制(3)- Handler和Looper
-
Handler异步消息传递机制(四)Handler发送消息流程,源码(Android 9.0)彻底解析