FusedLocationProviderClient.removeLocationUpdates 总是返回失败

2022-09-04 08:13:19

我有一个扩展的基础,称为所有这一切都是创建一个位置服务客户端activityclassLocationAwareActivityLocationAwareActivityactivity

LocationServices.getFusedLocationProviderClient和位置更新。listens

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

当活动被破坏时,它会调用 .我发现的是removeLocationUpdates

  • removeLocationUpdate返回始终返回不成功的任务
  • 更令人担忧的是,因为位置活动没有被删除,没有被垃圾回收。activity

enter image description here- 因此,如果我启动从该活动继承的任何活动始终保留在堆上。LocationAwareActivity

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

可以在此处访问此项目的完整源代码 - https://github.com/snijsure/MultiActivity


答案 1

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

尽管如此,在其他地方仍有可能内存泄漏。您应该尝试在您的应用程序中集成 Leakcanary,它可以为您提供参考树,并告诉您哪个字段或侦听器导致此内存泄漏。您可以在这里参考我唯一的博客文章之一

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");
            }
        }
    }

答案 2

嗨@Subodh Nijsure 请检查下面的代码并粘贴到您的代码中,然后检查它:

final Task<Void> voidTask = locationProviderClient.removeLocationUpdates(locationCallback);
                voidTask.addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        Log.e(TAG, "addOnCompleteListener: "+task.isComplete());
                    }
                });

                voidTask.addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.e(TAG, "addOnSuccessListener: " );
                    }
                });

                voidTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "addOnFailureListener: ");
                    }
                });

我认为voidTask.isSuccessful()当你把这个监听器放在那个时候它工作正常时,这种方法不起作用,我也看到内存,当进入上一个活动时,它会释放所有内存。

当你重定向到任何活动时,请停止LocationUpdates()调用一次到onPause()并从其他方法中删除,如onDestroy(),onStop()因为它停止一次,所以我们为什么要调用多次。

希望这对您有所帮助。


推荐