內部Fragment設定為public static和checkReleaseBuilds false與abortOnError false

王世暉發表於2016-04-20



在維護一個老專案的時候,發現以前的Activity裡邊有一個內部Fragment繼承自DIalogFragment,但是這個內部Fragment沒有public和static修飾,Android Studio 智慧地發現了這個問題並給出了錯誤。雖然給出了錯誤提示,但是AndroidStudio竟然能正常的打包,檢視build.gradle發現了這句話
android {
lintOptions{
checkReleaseBuilds false
abortOnError false
}
}checkReleaseBuilds就是在打包Release版本的時候進行檢測,這裡就直接關掉了,這樣即使有報錯也不會停止打包了。這個也太簡單粗暴了。
還是按照規範設定內部fragment為public static 的吧。
這樣的話在fragment裡邊要訪問所屬activity的物件就通過getActivity然後強制型別轉換訪問,不能直接訪問了(static 訪問非static錯誤)。
注意兩點:
1、建議每個fragment都設定一個空的構造器,方便恢復狀態,有引數的構造器在恢復狀態的時候並不會呼叫。要給fragment傳遞引數,使用setArguments(Bundle)
2、非static內部類潛在會有記憶體洩露問題,因為其持有外部類的引用。static內部類不會持有外部類引用。



按照Lint的建議將內部類改成static靜態內部類後,由於不可能將當前類的所有全域性物件都宣告為static物件,所以會報“Cannot make a static reference to the non-static field”的錯誤,這時候可以使用軟引用來解決這個問題,具體程式碼如下:

public static class LoadDataHandler extends Handler{
	private SoftReference<MainActivity> activitySRF = null;
	public LoadDataHandler(MainActivity activity){
		activitySRF = new SoftReference<MainActivity>(activity);
	}

相關文章