在 onDestroy 方法中。
匿名实现
在 onSaveInstanceState 中使用匿名实现的 locationListener 运行初始化函数。
为什么 locationManager.removeUpdates(locationListener) 不释放对 Activity 的引用?任何建议都将不胜感激!先行致谢!
编辑:好吧,我还没有解决 MemoryLeak,但我已经删除了匿名类,并改为让 Activity 实现 LocationListener。
我仍然面临同样的内存泄漏问题。
locationManager.removeUpdates(locationListener);
locationListener = null;
匿名实现
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null) {
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (chatId != null) {
double radius = 6378.137;
double oldLat = mLastLocation.getLatitude();
double oldLng = mLastLocation.getLongitude();
double newLat = location.getLatitude();
double newLng = location.getLongitude();
double dLat = Math.toRadians(newLat - oldLat);
double dLng = Math.toRadians(newLng - oldLng);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(oldLat))
* Math.cos(Math.toRadians(newLat)) * Math.sin(dLng / 2)
* Math.sin(dLng / 2);
double c = 2 * Math.asin(Math.sqrt(a));
double valueResult = radius * c;
double difInMeters = valueResult * 1000;
if (difInMeters > 2.0) {
pushLocation(location);
}
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.d(TAG, "onStatusChanged: " + status);
switch (status) {
case LocationProvider.AVAILABLE:
Log.d(TAG, "GPS.Available");
break;
case LocationProvider.OUT_OF_SERVICE:
Log.d(TAG, "GPS.OutOfService");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d(TAG, "GPS.TemporarilyUnavailable");
break;
}
}
@Override
public void onProviderEnabled(String provider) {
Log.d(TAG, "onProviderEnabled: " + provider.toString());
}
@Override
public void onProviderDisabled(String provider) {
Log.d(TAG, "onProviderdisabled: " + provider.toString());
}
};
LocationManager和LocationListener是从以下位置导入的:
import android.location.LocationListener;
import android.location.LocationManager;
当我按下返回按钮离开活动时,我尝试重写onBackPressed并在其中移除locationManager中的更新,但是我仍然得到了相同的泄漏。
以下是具有泄漏的Logcat。
D/LeakCanary: In findmyfriends:1.0:1.
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * findmyfriends.ScrollingMessengerActivity has leaked:
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * GC ROOT android.location.LocationManager$ListenerTransport.mListener
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * references findmyfriends.ScrollingMessengerActivity$6.this$0 (anonymous implementation of android.location.LocationListener)
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * leaks findmyfriends.ScrollingMessengerActivity instance
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Retaining: 0.89 MB.
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Reference Key: bead30b1-667e-45b1-8ccd-86a97abbfe43
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Device: samsung samsung SAMSUNG-SM-G891A poseidonlteuc
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Android Version: 6.0.1 API: 23 LeakCanary: 1.4 6b04880
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Durations: watch=5025ms, gc=173ms, heap dump=2093ms, analysis=34462ms
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Details:
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: * Instance of android.location.LocationManager$ListenerTransport
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | static TYPE_STATUS_CHANGED = 2
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | static TYPE_PROVIDER_DISABLED = 4
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | static TYPE_PROVIDER_ENABLED = 3
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | static TYPE_LOCATION_CHANGED = 1
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | static $staticOverhead = byte[32]@331418625 (0x13c10c01)
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | mListener = ScrollingMessengerActivity$6@324639008 (0x13599920)
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | mListenerHandler = android.location.LocationManager$ListenerTransport$1@322816704 (0x133dcac0)
09-26 18:28:13.367 25892-26857/findmyfriends D/LeakCanary: | this$0 = android.location.LocationManager@322815648 (0x133dc6a0)
我之前在onOrientationChange中发现了locationListener的内存泄漏问题,
我通过放置以下代码来解决它:
if (childListener != null) {
mChatRef.removeEventListener(childListener);
childListener = null;
}
在 onSaveInstanceState 中使用匿名实现的 locationListener 运行初始化函数。
为什么 locationManager.removeUpdates(locationListener) 不释放对 Activity 的引用?任何建议都将不胜感激!先行致谢!
编辑:好吧,我还没有解决 MemoryLeak,但我已经删除了匿名类,并改为让 Activity 实现 LocationListener。
我仍然面临同样的内存泄漏问题。