Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android framework回顧 sp 和 wp sp對象

Android framework回顧 sp 和 wp sp對象

編輯:關於Android編程

用MediaPlayer說明sp的實現。sp是一個模板類,T是RefBase的子類。只要繼承於RefBase的類都可以使用sp。binder類也繼承RefBase類,binder的實現離不開RefBase。

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


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

413 static void
414 android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
415 {
416 ALOGV("start");
417 sp 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的start函數呢?
sp就是個模板類。:

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

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

mp的生命周期只在android_media_MediaPlayer_start方法裡面有效,方法執行完後就該釋放。
這就有問題了,如果mp裡面所有內存都釋放了,別的地方還有引用,就會出現空指針。如果不釋放,別的地方又不引用了,就內存洩露了。

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

sp wp RefBase T 類之間的關系如下圖

\


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

getMediaPlayer執行完後,會調用匿名對象的析構函數~sp,執行m_ptr->decStrong(this),使MediaPlayer對象的強弱應用都減一。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1NphbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3N0YXJ0uq/K/cDvw+ajrLbUbXC9+NDQuLMmIzIwNTQwO6OsyrnTw7XEysfW2NTYtcRvcGVyYXRvcj2jrNbY1Ni1xLn9s8zSsta00NBtX3B0ci0+aW5jU3Ryb25nKHRoaXMpo6zSssq5TWVkaWFQbGF5ZXK21M/ztcTHv8j10v3Tw9T2vNMxoaNhbmRyb2lkX21lZGlhX01lZGlhUGxheWVyX3N0YXJ0uq/K/da00NDN6rrzo6zKzbfFbXCjrLvhtffTw21wtcTO9rm5uq/K/aOs1rTQ0G1fcHRyLT5kZWNTdHJvbmcodGhpcymjrNKyyrlNZWRpYVBsYXllcrbUz/O1xMe/yPXS/dPDtry809K7Lsjnz8LNvKO6PGJyPgo8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20141020/20141020084540100.png" alt="">

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved