偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android應(yīng)用程序消息處理機制(Looper、Handler)分析(3)

移動開發(fā) Android
函數(shù)prepareMainLooper做的事情其實就是在線程中創(chuàng)建一個Looper對象,這個Looper對象是存放在sThreadLocal成員變量里面的。成員變量sThreadLocal的類型為ThreadLocal,表示這是一個線程局部變量,即保證每一個調(diào)用了 prepareMainLooper函數(shù)的線程里面都有一個獨立的Looper對象。

函數(shù)prepareMainLooper做的事情其實就是在線程中創(chuàng)建一個Looper對象,這個Looper對象是存放在sThreadLocal成員變量里面的。

成員變量sThreadLocal的類型為ThreadLocal,表示這是一個線程局部變量,即保證每一個調(diào)用了 prepareMainLooper函數(shù)的線程里面都有一個獨立的Looper對象。

在線程是創(chuàng)建Looper對象的工作是由prepare函數(shù)來完成的,而在創(chuàng)建Looper對象的時候,會同時創(chuàng)建一個消息隊列MessageQueue,保存在Looper的成員變量mQueue中,后續(xù)消息就是存放 在這個隊列中去。

消息隊列在Android應(yīng)用程序消息處理機制中最重要的組件,因此,我們看看它的創(chuàng)建過程,即它的構(gòu)造函數(shù)的實現(xiàn)。

實現(xiàn) frameworks/base/core/java/android/os/MessageQueue.java文件中:

  1. [java] view plaincopypublic class MessageQueue { 
  2.  ...... 
  3.  private int mPtr; // used by native code 
  4.  private native void nativeInit(); 
  5.  MessageQueue() { 
  6.  nativeInit(); 
  7.  } 
  8.  ...... 
  9.  } 

它的初始化工作都交給JNI方法nativeInit來實現(xiàn)了,這個JNI方法定義在frameworks/base/core/jni/android_os_MessageQueue.cpp文件中:

  1.   [cpp] view plaincopystatic void android_os_MessageQueue_nativeInit(JNIEnv* 
  2. env, jobject obj) { 
  3.   NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue(); 
  4.   if (! nativeMessageQueue) { 
  5.   jniThrowRuntimeException(env, "Unable to allocate native queue"); 
  6.   return
  7.   } 
  8.   android_os_MessageQueue_setNativeMessageQueue(env, obj, 
  9. nativeMessageQueue); 
  10.   } 

在JNI中,也相應(yīng)地創(chuàng)建了一個消息隊列NativeMessageQueue,NativeMessageQueue類也是定義在 frameworks/base/core/jni/android_os_MessageQueue.cpp文件中,它的創(chuàng)建過程如下所示:

  1. [cpp] view plaincopyNativeMessageQueue::NativeMessageQueue() { 
  2. mLooper = Looper::getForThread(); 
  3. if (mLooper == NULL) { 
  4. mLooper = new Looper(false); 
  5. Looper::setForThread(mLooper); 

它主要就是在內(nèi)部創(chuàng)建了一個Looper對象,注意,這個Looper對象是實現(xiàn)在JNI層的,它與上面Java層中的Looper是不一樣的,不過它們是對應(yīng)的,下面我們進一步分析消息循環(huán)的過程的時候,讀者就會清楚地了解到它們之間的關(guān)系。

這個Looper的創(chuàng)建過程也很重要,不過我們暫時放一放,先分析完android_os_MessageQueue_nativeInit函數(shù)的執(zhí) 行,它創(chuàng)建了本地消息隊列NativeMessageQueue對象之后,接著調(diào)用 android_os_MessageQueue_setNativeMessageQueue函數(shù)來把這個消息隊列對象保存在前面我們在Java層中創(chuàng) 建的MessageQueue對象的mPtr成員變量里面:

  1.   [cpp] view plaincopystatic void 
  2. android_os_MessageQueue_setNativeMessageQueue(JNIEnv* env, jobject 
  3. messageQueueObj, 
  4.   NativeMessageQueue* nativeMessageQueue) { 
  5.   env->SetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr, 
  6.   reinterpret_cast(nativeMessageQueue)); 
  7.   } 

這里傳進來的參數(shù)messageQueueObj即為我們前面在Java層創(chuàng)建的消息隊列對象,而 gMessageQueueClassInfo.mPtr即表示在Java類MessageQueue中,其成員變量mPtr的偏移量,通過這個偏移量, 就可以把這個本地消息隊列對象natvieMessageQueue保存在Java層創(chuàng)建的消息隊列對象的mPtr成員變量中,這是為了后續(xù)我們調(diào)用 Java層的消息隊列對象的其它成員函數(shù)進入到JNI層時,能夠方便地找回它在JNI層所對應(yīng)的消息隊列對象。

責(zé)任編輯:閆佳明 來源: bbs.9ria
相關(guān)推薦

2014-05-22 15:00:16

Android消息處理機制Looper

2014-05-22 15:07:44

Android消息處理機制Looper

2014-05-22 15:38:27

Android消息處理機制Looper

2014-05-22 15:48:50

Android消息處理機制Looper

2014-05-22 15:41:59

Android消息處理機制Looper

2014-05-22 14:57:28

Android消息處理機制Looper

2014-05-22 15:15:53

Android消息處理機制Looper

2014-05-22 15:18:25

Android消息處理機制Looper

2014-05-22 15:33:31

Android消息處理機制Looper

2014-05-22 15:45:58

Android消息處理機制Looper

2011-04-28 11:01:40

Android消息處理LooperHandler

2011-11-23 09:33:45

HandlerLooperMessage

2014-05-27 10:13:57

移動技術(shù)半月刊

2016-10-21 13:03:18

androidhandlerlooper

2011-09-05 17:40:40

MTK定時器

2011-03-17 09:20:05

異常處理機制

2021-08-12 16:28:10

AndroidHandleLooper

2009-07-17 10:42:06

Swing應(yīng)用程序處理函數(shù)

2023-06-15 14:09:00

解析器Servlet容器

2023-03-08 08:54:59

SpringMVCJava
點贊
收藏

51CTO技術(shù)棧公眾號