編輯:關於Android編程
用如下代碼說說我遇到的疑惑。
201 static sp
202 {
203 Mutex::Autolock l(sLock);
204 MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context);
205 return sp
206 }
413 static void
414 android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
415 {
416 ALOGV("start");
417 sp
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
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 wp RefBase T 類之間的關系如下圖
用sp
return sp
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="">
首先,感謝公司能給我閒暇的時間,來穩固我的技術,讓我不斷的去探索研究,在此不勝感激。 先不說實現功能,上圖看看效果 這個是續上一次水平變色進度條的有一個全新的控件,理論實
先看個簡單的,先上個效果圖,吸引大家一下眼球。三個頁面間的滑動,此時是帶著上面的標題一塊滑動的。看一下android 對於PagerTitleStrip的官方解釋:Pag
由於項目上的需要側滑條目展示收藏按鈕,記得之前代碼家有寫過一個厲害的開源控件 AndroidSwipeLayout 本來准備直接拿來使用,但是看過 issue 發現現在有
本文實例講述了Android編程中HTTP服務用法。分享給大家供大家參考,具體如下:在Android中,除了使用java.net包下的API訪問HTTP服務之外,我們還可