溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android的構(gòu)造函數(shù)如何實現(xiàn)

發(fā)布時間:2021-12-18 16:43:13 來源:億速云 閱讀:193 作者:iii 欄目:移動開發(fā)

這篇文章主要講解了“Android的構(gòu)造函數(shù)如何實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Android的構(gòu)造函數(shù)如何實現(xiàn)”吧!

函數(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應用程序消息處理機制中最重要的組件,因此,我們看看它的創(chuàng)建過程,即它的構(gòu)造函數(shù)的實現(xiàn)。

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

[java] view plaincopypublic class MessageQueue {  ......  private int mPtr; // used by native code  private native void nativeInit();  MessageQueue() {  nativeInit();  }  ......  }

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

[cpp] view plaincopystatic void android_os_MessageQueue_nativeInit(JNIEnv* env, jobject obj) { NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue(); if (! nativeMessageQueue) { jniThrowRuntimeException(env, "Unable to allocate native queue"); return; } android_os_MessageQueue_setNativeMessageQueue(env, obj, nativeMessageQueue); }

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

[cpp] view plaincopyNativeMessageQueue::NativeMessageQueue() { mLooper = Looper::getForThread(); if (mLooper == NULL) { mLooper = new Looper(false); Looper::setForThread(mLooper); } }

它主要就是在內(nèi)部創(chuàng)建了一個Looper對象,注意,這個Looper對象是實現(xiàn)在JNI層的,它與上面Java層中的Looper是不一樣的,不過它們是對應的,下面我們進一步分析消息循環(huá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成員變量里面:

[cpp] view plaincopystatic void android_os_MessageQueue_setNativeMessageQueue(JNIEnv* env, jobject messageQueueObj, NativeMessageQueue* nativeMessageQueue) { env->SetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr, reinterpret_cast(nativeMessageQueue)); }

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

感謝各位的閱讀,以上就是“Android的構(gòu)造函數(shù)如何實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Android的構(gòu)造函數(shù)如何實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI