【问题标题】:Is it a good practice to save activity instance in a WeakReference将活动实例保存在 WeakReference 中是否是一种好习惯
【发布时间】:2017-05-24 13:35:19
【问题描述】:

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 方法,这段代码完成了工作,但根据 cmets,我很困惑是否使用它

我已经提到了document,但还不清楚。

【问题讨论】:

    标签: android android-activity intentservice weak-references


    【解决方案1】:

    这样做是个好习惯吗?

    没有。

    目的是从服务中访问Activity方法

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

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

    【讨论】:

    • 我已经实现了LocalBroadcastManager 它正在执行任务,但我们可以相信这个广播吗?会一直解决吗??
    • @Prabs:我不知道你所说的“信任这个广播”或“总是被解决”是什么意思。根据定义,某些事件可能没有注册任何内容。但是,在这种情况下,服务可以发现它并采取其他步骤。例如,您可以发送本地广播,并且如果您没有接收事件的前台 UI,则服务可以改为引发 Notification。见this sample app
    【解决方案2】:

    不,在项目中的任何位置存储Activity 的引用不是一个好习惯,但如果您愿意,请创建一个interface 使用接口实现您的活动,并将该接口作为您的活动和@ 之间的通信方式传递987654323@为您服务。

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

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多