簡體   English   中英

弱引用對象上的調用方法

[英]Calling methods on a weak reference object

我創建了一個靜態變量來保存應用程序上下文,因為我打算在該類的其他地方使用它。 該變量已在類的構造函數中分配,並且出現以下錯誤-“請勿將Android上下文類放在靜態字段(對MyClass的靜態引用中,其中的appContext指向Context的字段);這是內存泄漏(並且也會中斷即時運行)[StaticFieldLeak]“

以下是MyClass中的代碼:

private static Context appContext;
public MyClass(Context context) {
   appContext = context;
}

為了解決此問題,我想到了將appContext作為弱引用變量。 但是我無法在該變量上調用任何方法,因為它的引用很弱。 以下是更新的代碼以及嘗試在弱對象上調用方法時遇到的錯誤。

更新的代碼:

private final WeakReference<Context> appContext;
public MyClass(Context context) {
   appContext = new WeakReference<Context>(context);
}

在我班上的某些地方,我試圖調用appContext.getPackageManager()和appContext.getString(),但看到以下錯誤:

error: cannot find symbol
symbol:   method getPackageManager()
location: variable appContext of type WeakReference<Context>

error: cannot find symbol
symbol:   method getString(int)
location: variable appContext of type WeakReference<Context>

如果不將變量設為弱引用,如何解決內存泄漏問題? 或者,如果我做一個弱引用,我該如何執行方法呢?

您需要在WeakReference<Context>上調用get()方法,以推斷Context值。

WeakReference<Context>沒有getPackageManager()方法,這就是為什么會出現該錯誤的原因。

整個“上下文”確實使在Android中進行分層變得非常困難。
在沒有看到您嘗試訪問的類的情況下,很難確定,但是一個選擇是使所有函數靜態化,並使用其他類的上下文進行調用。 您可以將上下文傳遞給靜態函數並在其中使用它,只是不能將其保存為靜態變量。 例如:

static void doStuff(Context context){
//do context stuff
}
MyClass.doStuff(myCurrentClass.this);

如果將類實例化為對象,甚至根本不需要使全局上下文變量靜態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM