Android framework回顧 sp 和 wp sp對象,androidwp

來源:互聯網
上載者:User

Android framework回顧 sp 和 wp sp對象,androidwp
        用MediaPlayer說明sp的實現。sp是一個模板類,T是RefBase的子類。只要繼承於RefBase的類都可以使用sp。binder類也繼承RefBase類,binder的實現離不開RefBase。

用如下代碼說說我遇到的疑惑。


 201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
 202 {                                                                                                                                  
 203     Mutex::Autolock l(sLock);
 204     MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context);
 205     return sp<MediaPlayer>(p);  //(1)c++兩種初始化對象方法。
 206 } 

 413 static void
 414 android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
 415 {
 416     ALOGV("start");
 417     sp<MediaPlayer> mp = getMediaPlayer(env, thiz);  //(2)重載的操作符 = 
 418     if (mp == NULL ) {
 419         jniThrowException(env, "java/lang/IllegalStateException", NULL);
 420         return;
 421     }
 422     process_media_player_call( env, thiz, mp->start(), NULL, NULL ); //(3)
 423 }

sp是什嗎?
mp是sp<MediaPlayer>的對象,怎麼的能調用到MediaPlayer的start函數呢?
sp就是個模板類。:

那mp怎麼調用start()的呢?
查看sp源碼類,就會發現sp類中重寫了->, 使->指向成員變數m_ptr(T* 模板參數的對象,如MediaPlayer),
mp->的返回值是m_ptr,即返回的是MediaPlayer的對象,當然能調用start方法了。

其實sp中還重寫了 & 和 = 操作符 。

mp的生命週期只在android_media_MediaPlayer_start方法裡面有效,方法執行完後就該釋放。
這就有問題了,如果mp裡面所有記憶體都釋放了,別的地方還有引用,就會出現null 指標。如果不釋放,別的地方又不引用了,就記憶體泄露了。

怎麼解決這個問題呢?
Android 引入了引用計數,weakref_impl類裡面儲存引用數目,記錄了T被引用的次數。引用次數為0時就釋放。但是如過,sp<T1> 和sp<T2>之間相互引用,就相互依賴,沒法釋放了。這時又引入了強引用和弱引用。

sp wp RefBase T 類之間的關係如



用sp<MediaPlayer>分析,計數過程,
return sp<MediaPlayer>(p); 構造時,執行m_ptr->incStrong(this)方法,使MediaPlayer對象的強弱引用都加一,

getMediaPlayer執行完後,會調用匿名對象的解構函式~sp,執行m_ptr->decStrong(this),使MediaPlayer對象的強弱應用都減一。

在android_media_MediaPlayer_start函數裡面,對mp進行賦值,使用的是重載的operator=,重載的過程也執行m_ptr->incStrong(this),也使MediaPlayer對象的強弱引用增加1。android_media_MediaPlayer_start函數執行完後,釋放mp,會調用mp的解構函式,執行m_ptr->decStrong(this),也使MediaPlayer對象的強弱引用都加一.如:



聽過wp簽證與sp簽證,兩個詞分別什意思,什不同?

新加坡的工作準證分為 EP,WP,SP三種。
WP 就是月薪1800以下,屬於勞務准證。WP= work permit ,中文翻譯為工作準證。
SP 是給月薪1800以上的,有本科或者專科學曆者申請的工作證。 SP= special pass,中文翻譯為特別准證。
EP分3種 1.p1 月薪7000以上,擁有被認可的大學或以上學曆,如professional qualification and specialist skills的人,而且工作是管理程或者proffessional ,administrative, executive 的工作。(就是進階的管理員和專業的職業) 2.p2 月薪3500-7000,要求與p1差不多一樣 3.P3 月薪2500 以上,學曆要求與p1一樣,有相關工作經驗和技術者比較適合
EP= Employment pass。
還有一種家屬准證(DP),英文為 dependent's pass。
 
netFramework-v35 與 netFramework-v35 SP1 這兩個版本的不同是什?

SP1是在v3.5版上打了一個補丁包之後的發布版,只需要裝SP1版就行
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.