我有一个activity,它扩展了一个称为class的基本LocationAwareActivity,所有LocationAwareActivity activity所做的就是创建位置服务客户端
LocationServices.getFusedLocationProviderClientlistens
位置更新。

此 Activity 的来源在这里
https://github.com/snijsure/MultiActivity/blob/master/app/src/main/java/com/example/subodhnijsure/multiactivity/LocationAwareActivity.java

当 Activity 被销毁时,它将调用removeLocationUpdates。我发现的是

  • removeLocationUpdate返回始终返回不成功的
  • 的任务
  • 更令人担忧的是,由于未删除位置 Activity ,因此未对activity进行垃圾收集。

  • java - FusedLocationProviderClient.removeLocationUpdates总是返回失败-LMLPHP
    -因此,如果我启动从LocationAwareActivity继承的任何 Activity ,则该 Activity 将始终停留在堆上。

    因此,问题是停止接收位置更新从而允许对activity进行垃圾收集的正确方法是什么。

    可以在这里访问该项目的全部源代码-https://github.com/snijsure/MultiActivity

    最佳答案

    removeLocationUpdates 中,您应该传递 locationCallback ,当前实现是错误的。

    尽管如此,仍有可能在其他地方发生内存泄漏。您应该尝试将Leakcanary集成到您的应用中,它可以为您提供引用树,并告诉您哪个字段或监听器导致了此内存泄漏。
    你可以引用one of my only blog post here

    public void stopLocationUpdates() {
            if (locationProviderClient != null) {
                try {
                    final Task<Void> voidTask = locationProviderClient.removeLocationUpdates(locationCallback);
                    if (voidTask.isSuccessful()) {
                        Log.d(TAG,"StopLocation updates successful! ");
                    } else {
                        Log.d(TAG,"StopLocation updates unsuccessful! " + voidTask.toString());
                    }
                }
                catch (SecurityException exp) {
                    Log.d(TAG, " Security exception while removeLocationUpdates");
                }
            }
        }
    

    10-08 17:36