您现在的位置是:主页 > news > 百度网站优化排名/快速网站推广公司

百度网站优化排名/快速网站推广公司

admin2025/6/23 8:36:10news

简介百度网站优化排名,快速网站推广公司,茂港手机网站建设公司,成都旅行社网站建设面试的时候经常被问到Handler机制,但一直也没有自己去看源码总结,最近有空,自己总结下。自我感觉逻辑方面很清晰。 Handler机制本质上就是一个MessageQueue管理Message的过程 先上图 Looper.prepare初始化looperlooper内部初始化cpp中回调自…

百度网站优化排名,快速网站推广公司,茂港手机网站建设公司,成都旅行社网站建设面试的时候经常被问到Handler机制,但一直也没有自己去看源码总结,最近有空,自己总结下。自我感觉逻辑方面很清晰。 Handler机制本质上就是一个MessageQueue管理Message的过程 先上图 Looper.prepare初始化looperlooper内部初始化cpp中回调自…

面试的时候经常被问到Handler机制,但一直也没有自己去看源码总结,最近有空,自己总结下。自我感觉逻辑方面很清晰。

Handler机制本质上就是一个MessageQueue管理Message的过程

先上图

Looper.prepare初始化looper
looper内部初始化
cpp中回调
自己写的逻辑 把message压入队列
Looper.loop运行消息队列
handleMessage
创建Handler
配置Looper
消息队列
创建发送消息的Thread
回调run方法
looper循环

分析具体步骤:

  1. 创建Handler
  2. 初始化looper
  3. 开启循环遍历消息队列
  4. 创建Thread 并设置回调
  5. 回调Thread的run方法
  6. 发送消息

1. 创建Handler

默认情况下,会获取当前线程的looper,如果非主线程没有初始化,会抛异常

		mLooper = Looper.myLooper();if (mLooper == null) {throw new RuntimeException("Can't create handler inside thread " + Thread.currentThread()+ " that has not called Looper.prepare()");}

2. 初始化looper Looper.prepare()

初始化looper,会通过cpp建立一个消息队列,并且looper中持有当前线程的对象

	private static void prepare(boolean quitAllowed) {...sThreadLocal.set(new Looper(quitAllowed));}private Looper(boolean quitAllowed) {mQueue = new MessageQueue(quitAllowed);//looper绑定消息队列mThread = Thread.currentThread();//looper绑定当前线程}MessageQueue(boolean quitAllowed) {mQuitAllowed = quitAllowed;mPtr = nativeInit();//创建对应的cpp   NativeMessageQueue*对象}

3. 开启循环遍历消息队列 looper.looper()

开启一个死循环来遍历消息队列

 //looper方法中执行死循环for (;;) {...//looper()方法中msg.target.dispatchMessage(msg);}//handler()方法中public void dispatchMessage(Message msg) {...//调用自定义逻辑handleMessage(msg);}	

4. 创建Thread pthread_create创建线程,并设置回调

//cpp中创建
Thread* child_thread = new Thread(is_daemon);
//创建线程
pthread_create_result = pthread_create(&new_pthread,&attr,Thread::CreateCallback,child_thread);

5. 通过java_lang_Thread_run调用Thread的run方法

//回调java
jmethodID mid = WellKnownClasses::java_lang_Thread_run;
...
InvokeVirtualOrInterfaceWithJValues(soa, ref.get(), mid, nullptr);
...
ArtMethod* method = FindVirtualMethod(receiver, jni::DecodeArtMethod(mid));
...
InvokeWithArgArray(soa, method, &arg_array, &result, shorty);

6. 发送消息handler.sendEmptyMessage(1)

//获取looper的消息队列
MessageQueue queue = mQueue;
//消息msg插入队列中
msg.next = p; 
prev.next = msg;