【问题标题】:Pass activity to LifecycleObserver将活动传递给 LifecycleObserver
【发布时间】:2020-10-11 19:06:31
【问题描述】:

我需要将活动传递给 LifecycleObserver 类以执行定位任务:

class LocationObserver(
        private val context: Context,
        private val activity: FragmentActivity) : LifecycleObserver {
    
    private var locationClient: FusedLocationProviderClient? = null
    private val locationListener = OnSuccessListener { location: Location? ->
        if (location != null) {
            val lat = location.latitude
            val long = location.longitude
            ...
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun start() {
        locationClient = LocationServices.getFusedLocationProviderClient(activity)
        ...
        locationClient?.lastLocation?.addOnSuccessListener(activity, locationListener)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun stop() {
        locationClient = null
    }
}

LocationObserver 在片段中创建和使用:

public class LocationFragment extends Fragment {
    private LocationObserver locationObserver;
    
    public View onCreateView(@NonNull LayoutInflater inflater,
                       ViewGroup container, Bundle savedInstanceState) {
        ...
        locationObserver = new LocationObserver(this.getContext(), this.getActivity());
        getLifecycle().addObserver(locationObserver);
        
        return root;
    }
    ...
}

问题是:将活动传递给 LifecycleObserver-class 会导致内存泄漏吗?如果是这样,可能的解决方案是什么?非常感谢您的任何回答/评论!

【问题讨论】:

  • 你是如何实例化和使用 LocationObserver 的?
  • @Ahmed I. Khalil 嗨,LocationObserver 已在片段中创建和使用 - 我添加到问题中。
  • 是的,在你的 LifecycleObserver 中持有活动引用会导致内存泄漏。为了防止这种情况,您可以使用LiveDataCallback 将您的数据提供回活动。

标签: android memory-leaks android-lifecycle android-architecture-components lifecycleowner


【解决方案1】:

如果片段位于 Activity 内,那么您的 Fragment 可能不会有更长的生命周期,因此即使您保留对活动的引用,也不会真正发生泄漏。

但是,只要您删除 LocationObserver 中的所有 Activity 引用,您就会感到非常安全。

【讨论】:

  • 谢谢!请告诉我应该在 LocationObserver 的哪个位置调用:activity = null,在 onDestroy() 方法中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 2015-01-26
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多