本文出自:【張鴻洋的部落格】
本文大多數內容翻譯自:
我重新組織了下內容以及結構,建議大家盡可能看下原文。
context,相信不管是第一天開發android,還是開發android的各種老鳥,對於context的使用一定不陌生你在載入資源、啟動乙個新的activity、獲取系統服務、獲取內部檔案(夾)路徑、建立view操作時等都需要context的參與,可見context的常見性。大家可能會問到底什麼是context,context字面意思上下文,或者叫做場景,也就是使用者與作業系統操作的乙個過程,比如你打**,場景包括**程式對應的介面,以及隱藏在背後的資料;
但是在程式的角度context又是什麼呢?在程式的角度,我們可以有比較權威的答案,context是個抽象類,我們可以直接通過看其類結構來說明答案:
先扯這麼多,有能力了會從別的角度去審視context,加油~
下面開始介紹在使用context時,需要注意的問題。
大家在編寫一些類時,例如工具類,可能會編寫成單例的方式,這些工具類大多需要去訪問資源,也就說需要context的參與。
在這樣的情況下,就需要注意context的引用問題。
例如以下的寫法:
對於上述的單例,大家應該都不陌生(請別計較getinstance的效率問題),內部保持了乙個context的引用;package com.mooc.shader.roundimageview;
import android.content.context;
public
class
custommanager
public
static
synchronized custommanager getinstance
(context context)
return sinstance;
}//some methods
private
void
someothermethodneedcontext
()
}
這麼寫是沒有問題的,問題在於,這個context哪來的我們不能確定,很大的可能性,你在某個activity裡面為了方便,直接傳了個this;這樣問題就來了,我們的這個類中的sinstance是乙個static且強引用的,在其內部引用了乙個activity作為context,也就是說,我們的這個activity只要我們的專案活著,就沒有辦法進行記憶體**。而我們的activity的生命週期肯定沒這麼長,所以造成了記憶體洩漏。
那麼,我們如何才能避免這樣的問題呢?
有人會說,我們可以軟引用,嗯,軟引用,假如被**了,你不怕nullpointexception麼。
把上述**做下修改:
下面就開始介紹各種context的應用場景。public
static
synchronized custommanager getinstance
(context context)
return sinstance;
}
數字2:在這些類中去layout inflate是合法的,但是會使用系統預設的主題樣式,如果你自定義了某些樣式可能不會被使用。
數字3:在receiver為null時允許,在4.2或以上的版本中,用於獲取黏性廣播的當前值。(可以無視)
注:contentprovider、broadcastreceiver之所以在上述**中,是因為在其內部方法中都有乙個context用於使用。
golang中Context的使用場景總結
場景一 rpc呼叫 在主goroutine上有4個rpc,rpc2 3 4是並行請求的,我們這裡希望在rpc2請求失敗之後,直接返回錯誤,並且讓rpc3 4停止繼續計算。這個時候,就使用的到context 場景二 pipeline pipeline模式就是流水線模型,流水線上的幾個工人,有n個產品,...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...
Redis應用場景
redis開創了一種新的資料儲存思路,使用redis,我們不用在面對功能單調的資料庫時,把精力放在如何把大象放進冰箱這樣的問題上,而是利用redis靈活多變的資料結構和資料操作,為不同的大象構建不同的冰箱。redis常用資料型別 redis最為常用的資料型別主要有以下五種 在具體描述這幾種資料型別之...