Android知识梳理:消息机制之Looper
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());
}
}
解释:同一个线程下的handler共享一个looper对象,消息中保留了对handler的引用,只要有消息在队列中,那么handler便无法被回收,如果handler不是static那么使用Handler的Service和Activity就也无法被回收。这就可能导致内存泄露。这为什么会产生呢?因为MessageQueue是阻塞式的,即:一个处理完才处理下一个,如果你MessageQueue中有一些延时的操作,整个MessageQueue的生命周期就很长,可能超过了定义Handler所在的Service和Activity的生命周期;
三、消息处理:
还记得在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);
}
}
到这儿,Handler基本搞清楚,是不是感觉Handler很绕,通过Handler把Message发给系统,系统最后有调用我们写的handleMessage方法把消息传过来,让我们处理,这不瞎折腾嘛?
个人理解:由系统统一封装、排队、分发消息;
分享到:
相关推荐
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 Android消息循环分析 Android Activity developer 官网 (强烈推荐 dev guide) Android的启动模式(android:launchMode) ...
2. Android消息机制:包括Handler、Looper、MessageQueue和Message的概念及其在Android中的消息处理机制。 3. Android事件分发机制:解析了触摸事件在Android系统中的传递流程和处理。 4. AsyncTask详解:提供了在...
Handler 是 Android 中的一种消息处理机制,它可以将消息从一个线程传递到另一个线程中。Handler 的使用非常广泛,在 Android 开发中,它是必备的知识点之一。 1. Handler Looper Message 关系是什么? Handler、...
- Android多线程:Handler机制、AsyncTask使用方式等。 - Android数据存储:SQLite数据库的使用、SharedPreferences的配置等。 - Android权限管理:动态权限申请流程、权限组划分等。 - Android UI设计:自定义...
在Android开发领域,掌握一些关键的小知识能够极大地提升开发效率和代码质量。以下是一些根据多年经验整合的Android基础知识: 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), ...
这份“Android最新版最全面试题+知识点整理”提供了超过300道题目,旨在帮助开发者深入理解和巩固Android平台的关键概念。以下是对这些知识点的详细阐述: 1. **Android架构**:了解Android系统的分层结构,包括...
### Android高级开发面试题——Handler相关知识 #### 一、HandlerLooperMessage关系 **1. Handler、Looper与Message之间的关系** - **Handler**: 主要用于发送消息和处理消息。它作为一个桥梁,使得主线程和子...
以下是对"Android的小知识整理"的详细解读。 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), onPause(), onStop()和onDestroy()等生命周期方法至关重要。它们决定了应用在不同状态下...
在Android的世界里,开发者需要掌握一系列的关键知识点,才能在这一平台进行高效且创新的应用开发。..."Android小知识整理"这份资料应该包含了这些主题的详细讲解,对于初学者和进阶开发者都是很好的学习资源。
以下是一些主要的Android面试题及相关的知识点,这些内容由大神精心整理,对准备Android面试的开发者非常有帮助。 1. **Android基础知识** - 应用程序组件:Activity、Service、BroadcastReceiver、...
"android-skills"项目是一个精心整理的资源库,旨在帮助开发者系统地学习和巩固Android技术。这个项目按照不同的知识类别进行了组织,确保每个部分都能深入理解和掌握。以下是根据项目标题、描述和文件结构推测出的...
文档中的第一部分是关于Android中的Handler机制。Handler是Android开发中用于线程间通信的重要组件,它允许你在其他线程中发送和处理消息(Message)或者运行一个可执行的任务(Runnable)。每个Handler都与一个...
1. **Android基础知识**:包括Android应用的基本架构(Activity, Service, BroadcastReceiver, ContentProvider),Android组件间的通信机制,以及AndroidManifest.xml文件的作用。 2. **UI设计与布局**:涉及...
Java_Android 笔试、面试知识整理 本文档涵盖了 Java 和 Android 相关的笔试和面试知识点,包括计算机基础、计算机网络、数据结构与算法、操作系统、数据库系统、Java 基础、Android 开发等方面。 计算机基础知识...
- Handler/Looper/Messenger:消息机制,解决线程间通信问题。 - Binder:Android进程间通信(IPC)的核心机制,服务和服务的交互。 8. **高级面试题.docx**: - 可能包含更深层次的问题,如Android系统定制、热...
### Android知识点整理 #### Java基础 1. **面向对象的理解** - 面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。对象包括数据(即字段,也称为属性)和操作这些数据的方法。 - 封装:将对象的...
8. **多线程与并发**:掌握Android中的线程通信,如使用Handler、Message、AsyncTask,以及使用Java的synchronized关键字、Lock机制和线程池。 9. **网络编程**:理解HTTP协议和HTTPS的区别,熟悉使用...