av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

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

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

遂川網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,遂川網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為遂川數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的遂川做網(wǎng)站的公司定做!

成員變量sThreadLocal的類(lèi)型為T(mén)hreadLocal,表示這是一個(gè)線(xiàn)程局部變量,即保證每一個(gè)調(diào)用了 prepareMainLooper函數(shù)的線(xiàn)程里面都有一個(gè)獨(dú)立的Looper對(duì)象。

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

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

實(shí)現(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來(lái)實(shí)現(xiàn)了,這個(gè)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)建了一個(gè)消息隊(duì)列NativeMessageQueue,NativeMessageQueue類(lèi)也是定義在 frameworks/base/core/jni/android_os_MessageQueue.cpp文件中,它的創(chuàng)建過(guò)程如下所示:

 
 
  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)建了一個(gè)Looper對(duì)象,注意,這個(gè)Looper對(duì)象是實(shí)現(xiàn)在JNI層的,它與上面Java層中的Looper是不一樣的,不過(guò)它們是對(duì)應(yīng)的,下面我們進(jìn)一步分析消息循環(huán)的過(guò)程的時(shí)候,讀者就會(huì)清楚地了解到它們之間的關(guān)系。

這個(gè)Looper的創(chuàng)建過(guò)程也很重要,不過(guò)我們暫時(shí)放一放,先分析完android_os_MessageQueue_nativeInit函數(shù)的執(zhí) 行,它創(chuàng)建了本地消息隊(duì)列NativeMessageQueue對(duì)象之后,接著調(diào)用 android_os_MessageQueue_setNativeMessageQueue函數(shù)來(lái)把這個(gè)消息隊(duì)列對(duì)象保存在前面我們?cè)贘ava層中創(chuàng) 建的MessageQueue對(duì)象的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.   } 

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


本文名稱(chēng):Android應(yīng)用程序消息處理機(jī)制(Looper、Handler)分析(3)
文章路徑:http://uogjgqi.cn/article/dheohje.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流