在 WeakReference 中保存 activity 实例是一个好习惯吗
Is it a good practice to save activity instance in a WeakReference
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 对象。使用该对象,访问 activity.
中的方法
目的是从服务访问 Activity 方法,这段代码可以工作,但根据评论,我很困惑是否要使用它
我提到了 document 但不清楚。
Is it a good practice to do so?
没有
The purpose is to access Activity methods from service
那个activity可能不存在。例如,用户可以在服务为 运行 时按 BACK 键并销毁 activity。在已销毁的 activity 上调用方法可能会导致崩溃。
使用事件总线(LocalBroadcastManager
、greenrobot 的 EventBus 等)实现组件之间的松耦合通信,例如服务和活动之间的通信。让 activity 在可见时注册事件,并根据需要注册服务 post 事件。
不,在项目中的任何地方存储 Activity
的引用不是一个好习惯,但如果你想这样做,创建一个 interface
实现你的 activity 接口并传递它作为您的 activity 和 IntentService
与您的服务之间的通信方式的接口。
现在您的服务引用了您 activity 的(选定的)方法。通过该界面访问您的数据并在使用后清除参考。
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 对象。使用该对象,访问 activity.
目的是从服务访问 Activity 方法,这段代码可以工作,但根据评论,我很困惑是否要使用它
我提到了 document 但不清楚。
Is it a good practice to do so?
没有
The purpose is to access Activity methods from service
那个activity可能不存在。例如,用户可以在服务为 运行 时按 BACK 键并销毁 activity。在已销毁的 activity 上调用方法可能会导致崩溃。
使用事件总线(LocalBroadcastManager
、greenrobot 的 EventBus 等)实现组件之间的松耦合通信,例如服务和活动之间的通信。让 activity 在可见时注册事件,并根据需要注册服务 post 事件。
不,在项目中的任何地方存储 Activity
的引用不是一个好习惯,但如果你想这样做,创建一个 interface
实现你的 activity 接口并传递它作为您的 activity 和 IntentService
与您的服务之间的通信方式的接口。
现在您的服务引用了您 activity 的(选定的)方法。通过该界面访问您的数据并在使用后清除参考。