`

Android知识梳理:消息机制之Handler

 
阅读更多
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方法把消息传过来,让我们处理,这不瞎折腾嘛?
个人理解:由系统统一封装、排队、分发消息;
0
0
分享到:
评论

相关推荐

    Android代码-Android 一些重要知识点解析整理

    Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 Android消息循环分析 Android Activity developer 官网 (强烈推荐 dev guide) Android的启动模式(android:launchMode) ...

    Java基础+Android面试题

    2. Android消息机制:包括Handler、Looper、MessageQueue和Message的概念及其在Android中的消息处理机制。 3. Android事件分发机制:解析了触摸事件在Android系统中的传递流程和处理。 4. AsyncTask详解:提供了在...

    一线互联网大厂Android 高级开发面试题以及答案整理(1307页)

    Handler 是 Android 中的一种消息处理机制,它可以将消息从一个线程传递到另一个线程中。Handler 的使用非常广泛,在 Android 开发中,它是必备的知识点之一。 1. Handler Looper Message 关系是什么? Handler、...

    简历模板,Android 名企面试题及涉及知识点整理

    - Android多线程:Handler机制、AsyncTask使用方式等。 - Android数据存储:SQLite数据库的使用、SharedPreferences的配置等。 - Android权限管理:动态权限申请流程、权限组划分等。 - Android UI设计:自定义...

    Android小知识整理

    在Android开发领域,掌握一些关键的小知识能够极大地提升开发效率和代码质量。以下是一些根据多年经验整合的Android基础知识: 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), ...

    Android最新版最全面试题+知识点整理

    这份“Android最新版最全面试题+知识点整理”提供了超过300道题目,旨在帮助开发者深入理解和巩固Android平台的关键概念。以下是对这些知识点的详细阐述: 1. **Android架构**:了解Android系统的分层结构,包括...

    Android 高级开发面试题以及答案整理

    ### Android高级开发面试题——Handler相关知识 #### 一、HandlerLooperMessage关系 **1. Handler、Looper与Message之间的关系** - **Handler**: 主要用于发送消息和处理消息。它作为一个桥梁,使得主线程和子...

    Android的小知识整理

    以下是对"Android的小知识整理"的详细解读。 1. **Activity生命周期**:理解Activity的onCreate(), onStart(), onResume(), onPause(), onStop()和onDestroy()等生命周期方法至关重要。它们决定了应用在不同状态下...

    Android小知识整理(学习Android的好资料)

    在Android的世界里,开发者需要掌握一系列的关键知识点,才能在这一平台进行高效且创新的应用开发。..."Android小知识整理"这份资料应该包含了这些主题的详细讲解,对于初学者和进阶开发者都是很好的学习资源。

    Android面试题及知识点

    以下是一些主要的Android面试题及相关的知识点,这些内容由大神精心整理,对准备Android面试的开发者非常有帮助。 1. **Android基础知识** - 应用程序组件:Activity、Service、BroadcastReceiver、...

    android-skills:整理,记录Android知识经验

    "android-skills"项目是一个精心整理的资源库,旨在帮助开发者系统地学习和巩固Android技术。这个项目按照不同的知识类别进行了组织,确保每个部分都能深入理解和掌握。以下是根据项目标题、描述和文件结构推测出的...

    阿里、腾讯等一线互联网大厂Android 高级开发面试题以及答案整理(1307页).pdf

    文档中的第一部分是关于Android中的Handler机制。Handler是Android开发中用于线程间通信的重要组件,它允许你在其他线程中发送和处理消息(Message)或者运行一个可执行的任务(Runnable)。每个Handler都与一个...

    张泽华Android面试题整理

    1. **Android基础知识**:包括Android应用的基本架构(Activity, Service, BroadcastReceiver, ContentProvider),Android组件间的通信机制,以及AndroidManifest.xml文件的作用。 2. **UI设计与布局**:涉及...

    Java_Android笔试、面试知识整理.pdf

    Java_Android 笔试、面试知识整理 本文档涵盖了 Java 和 Android 相关的笔试和面试知识点,包括计算机基础、计算机网络、数据结构与算法、操作系统、数据库系统、Java 基础、Android 开发等方面。 计算机基础知识...

    收集整理的Android面试资料精编汇总文档资料(23个).zip

    - Handler/Looper/Messenger:消息机制,解决线程间通信问题。 - Binder:Android进程间通信(IPC)的核心机制,服务和服务的交互。 8. **高级面试题.docx**: - 可能包含更深层次的问题,如Android系统定制、热...

    android知识点整理

    ### Android知识点整理 #### Java基础 1. **面向对象的理解** - 面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。对象包括数据(即字段,也称为属性)和操作这些数据的方法。 - 封装:将对象的...

    Android面试题整理

    8. **多线程与并发**:掌握Android中的线程通信,如使用Handler、Message、AsyncTask,以及使用Java的synchronized关键字、Lock机制和线程池。 9. **网络编程**:理解HTTP协议和HTTPS的区别,熟悉使用...

Global site tag (gtag.js) - Google Analytics