我是否可以并且应该将Context传递给UI外部的静态方法



我四处寻找,但从未找到这个问题的直接答案。我想知道会发生什么,如果我使用的模式,要求我传递一个上下文静态方法做的事情后端。例如:

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来创建数据库助手的实例。我可以选择传递数据库助手本身,但然后我将创建实例(而不是得到它,因为它是单例)在活动代码,我宁愿不这样做。

我的问题真的是:如果,说,一个用户退出活动,而API调用正在进行中,这个上下文实例得到GC'd,并在响应回来时导致NPE ?我以前做过这种事情,从来没有注意到这个问题,但看起来这样做应该有一些后果。我知道其他开发人员必须在UI线程之外做一些需要上下文的事情,所以这应该是一个相对容易回答的问题。

谢谢你们了!请让我知道,如果你需要更多的信息,以提供更好的上下文。哈。

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

在上下文只在方法调用期间被引用的情况下,将活动作为this传递是可以的。

在你的情况下,似乎DatabaseHelper可以存储对上下文的引用,所以我会使用getApplicationContext()请注意,如果你传递一个活动,你不会得到NPE,因为引用是GC,这没有意义-如果DatabaseHelper存储一个强引用,这不会发生(至少在对活动本身的引用上)。

最新更新