在WeakReference中保存活动实例是一种好习惯

时间:2017-05-24 13:35:20

标签: android android-activity intentservice weak-references

Here, in this answer Activity实例保存在WeakReference<Activity>变量中。这样可以避免内存泄漏。这样做是一种好习惯吗?

public class BackgroundService extends IntentService {
    private static WeakReference<Activity> mActivityRef; 

    public static void updateActivity(Activity activity) {
        mActivityRef = new WeakReference<>(activity);
    }
}

我正在使用mActivityRef.get()并将其投射到所需的活动对象。使用该对象,访问活动中的方法。

目的是从服务访问Activity方法,这段代码完成了工作但是根据评论我很困惑是否使用它

我提到了document但还不清楚。

2 个答案:

答案 0 :(得分:2)

  

这样做是否是一种好习惯?

没有

  

目的是从服务

访问Activity方法

该活动可能不存在。例如,用户可以在服务运行时按BACK并销毁活动。对被破坏的活动调用方法可能会导致崩溃。

使用事件总线(LocalBroadcastManager,greenrobot的EventBus等)进行组件之间松散耦合的通信,例如服务和活动之间的通信。让活动在可见时注册事件,并根据需要提供服务发布事件。

答案 1 :(得分:0)

Activity的引用存储在项目的任何位置并不是一个好习惯,但是如果你想这样做,请创建一个interface实现你的活动与接口并传递该接口作为一种沟通方式您的活动和IntentService对您的服务。

现在,您的服务引用了您的活动(选定)方法。通过该界面访问您的数据,并在使用后清除参考。

相关问题