我环顾四周,但从来没有找到这个问题的直截了当的答案。我想知道如果我使用一个模式要求我将一个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调用进行过程中退出活动,那么这个Context实例会得到GC并在响应回来时导致NPE吗?我以前做过这种事情,从来没有注意到这个问题,但似乎应该有这样做的一些后果。我知道其他开发人员必须在UI线程上做一些需要Context的事情,所以这应该是一个相对容易回答的问题。
谢谢你们!如果您需要更多信息以提供更好的上下文,请与我们联系。嘿。
答案 0 :(得分:2)
规则是您不会将Activity的实例传递给某个对象,该对象可能会在Activity的生命周期之外保留对它的引用。这将导致内存泄漏,因为GC将无法释放分配给Activity的内存以及其中包含的整个视图树。在这些情况下,您传递getApplicationContext()
。
如果仅在方法调用的持续时间内引用上下文,则将活动作为this
传递是正常的。
在你的情况下,似乎DatabaseHelper可以存储对上下文的引用,所以我会使用getApplicationContext()
注意你不会得到NPE,因为如果你传递了一个Activity,那么引用就是GC了。 ; t有意义 - 如果DatabaseHelper存储了强引用,则不会发生这种情况(至少在对Activity本身的引用时)。