成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

消息隊列在Android應用程序消息處理機制中最重要的組件,因此,我們看看它的創建過程,即它的構造函數的實現。

實現 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來實現了,這個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中,也相應地創建了一個消息隊列NativeMessageQueue,NativeMessageQueue類也是定義在 frameworks/base/core/jni/android_os_MessageQueue.cpp文件中,它的創建過程如下所示:

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

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

這個Looper的創建過程也很重要,不過我們暫時放一放,先分析完android_os_MessageQueue_nativeInit函數的執 行,它創建了本地消息隊列NativeMessageQueue對象之后,接著調用 android_os_MessageQueue_setNativeMessageQueue函數來把這個消息隊列對象保存在前面我們在Java層中創 建的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.   } 

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

責任編輯:閆佳明 來源: bbs.9ria
相關推薦

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

移動技術半月刊

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應用程序處理函數

2023-06-15 14:09:00

解析器Servlet容器

2023-03-08 08:54:59

SpringMVCJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人亚洲一区 | a视频在线 | 久久久久久91 | 91免费观看视频 | 一本综合久久 | 1204国产成人精品视频 | xxxxxx国产 | 操久久| 精品国产伦一区二区三区观看体验 | 亚洲一区日韩 | 精品日韩一区 | 中文字幕免费在线 | 毛片在线看片 | 国产精品高潮呻吟久久av野狼 | 一级片免费在线观看 | 久久精品伊人 | 欧美国产视频 | 久久精品一 | 亚洲不卡在线观看 | 欧美日韩在线观看一区二区三区 | 国产精品欧美一区二区三区不卡 | 欧美激情精品久久久久久 | 欧美在线日韩 | 免费同性女女aaa免费网站 | 久久精品国产99国产 | 91精品国产高清久久久久久久久 | 黄视频免费在线 | 在线日韩欧美 | 91精品国产一区二区三区蜜臀 | 精品中文字幕视频 | 99精品国产一区二区三区 | 成人黄在线观看 | 自拍偷拍欧美 | 国产精品福利在线 | 午夜av电影 | 欧美aⅴ | 国产精品自产拍在线观看蜜 | 亚洲免费一区二区 | 久久国内精品 | 91香蕉视频在线观看 | 欧美日韩综合精品 |