gpt4 book ai didi

java - 我可以并且应该将 Context 传递给 UI 外部的静态方法吗?

转载 作者:行者123 更新时间:2023-12-02 03:20:51 28 4
gpt4 key购买 nike

我环顾四周,但从未找到这个问题的直接答案。我想知道如果我使用一种需要我将 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 调用,然后在成功响应后将对象写入本地数据库。但是,我需要传递一个上下文来创建数据库助手的实例。我也可以传递数据库助手本身,但随后我会在 Activity 代码中创建实例(而不是获取它,因为它是单例),我也不想这样做。

我的问题实际上是:如果用户在 API 调用正在进行时退出 Activity,那么当响应返回时,该 Context 实例是否会被 GC 并导致 NPE?我以前做过这种事情,从来没有注意到这个问题,但这样做似乎确实应该有一些后果。我知道其他开发人员必须在 UI 线程之外执行一些需要 Context 的操作,因此这应该是一个相对容易回答的问题。

谢谢大家!如果您需要更多信息来提供更好的上下文,请告诉我。呵呵。

最佳答案

规则是,您不要将 Activity 的实例传递给可能在 Activity 生命周期之外保留对其引用的某个对象。这将导致内存泄漏,因为 GC 将无法释放分配给 Activity 以及其中包含的整个 View 树的内存。在这些情况下,您传递 getApplicationContext()

如果仅在方法调用期间引用上下文,则可以将 Activity 作为 this 传递。

在您的情况下,DatabaseHelper 似乎可以存储对上下文的引用,因此我会使用 getApplicationContext() 请注意,您不会获得 NPE,因为如果您传递了 Activity,则引用是 GC ,这是没有意义的 - 如果 DatabaseHelper 存储强引用,则不会发生这种情况(至少在对 Activity 本身的引用上)。

关于java - 我可以并且应该将 Context 传递给 UI 外部的静态方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39636424/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com