簡體   English   中英

我可以並且應該將Context傳遞給UI之外的靜態方法嗎?

[英]Can I and should I pass a Context to a static method outside of the UI?

我環顧四周,但從未找到這個問題的直接答案。 我想知道如果我使用一種模式,該模式要求我將Context傳遞給靜態方法以在后端執行操作,那將會發生什么。 例如:

public static Observable<CreateThing> createNewThing(String thingName, Context context) { // Passing Context in
    return RestNetworker.handleResponse(ServiceGenerator.createService(Service.class).createThing(thingName))
            .doOnNext(response -> DatabaseHelper.getInstance(context).createThing(new Thing(response.getThingId(), thingName))); // context used to get instance of DatabaseHelper
}

此方法進行API調用,然后在成功響應后將對象本地寫入數據庫。 但是,我需要傳遞一個Context來創建數據庫助手的實例。 我可以替代地傳遞數據庫幫助程序本身,但是隨后我將在Activity代碼中創建實例(而不是獲得實例,因為它是單例的),而我也不願這樣做。

我的問題確實是:例如,如果用戶在進行API調用時退出了Activity,那么此Context實例會在響應返回時獲得GC並生成NPE嗎? 我以前做過這種事情,但從來沒有注意到這個問題,但是,看來這樣做確實會有一些后果。 我知道其他開發人員必須在需要上下文的UI線程上做一些事情,因此這應該是一個相對容易回答的問題。

多謝你們! 如果您需要更多信息以提供更好的上下文,請告訴我。 嘿。

規則是,不要將Activity的實例傳遞給某個對象,該對象可能會在Activity的生命周期之外保留對它的引用。 這將導致內存泄漏,因為GC將無法釋放分配給Activity的內存以及其中包含的整個視圖樹。 在這些情況下,您將傳遞getApplicationContext()

如果僅在方法調用期間引用上下文,則可以通過Activity,因為this很好。

在您的情況下,似乎DatabaseHelper可能存儲了對上下文的引用,因此我將使用getApplicationContext()注意,如果通過了Activity,則引用為GC,則不會獲得NPE,這沒有意義-如果DatabaseHelper存儲了一個強大的引用,這種情況不會發生(至少在對Activity本身的引用上)。

暫無
暫無

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

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