2017-02-17 3 views
0

У меня есть фрагмент, который использует диспетчер местоположений (android.location.LocationManager). mLocationManager и mLocationListener (android.location.LocationListener) являются частными переменными для фрагментации.LocationListener, протекающий во фрагменте, даже при правильном обращении

в onResume()

mLocationListener = new ABCLocationListener(); 
mLocationManager = (LocationManager) getActivity().getSystemService(
        Context.LOCATION_SERVICE); 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000L, 0F, mLocationListener); 

в OnPause()

mLocationManager.removeUpdates(mLocationListener); 
mLocationListener = null; 

Я получаю утечки для ABCLocationListener.

logcat D/LeakCanary: | mListener = [email protected]87568 (0x33733270)

Что я проверил?
1) Хэш-значение для создаваемого объекта ABCLocationListener отличается от 0x33733270.
2) Оба метода onResume и onPause вызываются только один раз. Слушателя хэш-значение в обеих этих методах перед вызовом removeUpdates и requestLocationUpdates такого же

+0

Какой тип родителя этого фрагмента - это ViewPager или вкладки? Также избегайте создания нового объекта из onResume() каждый раз. Просто создайте один раз и зарегистрируйтесь и отмените регистрацию. –

ответ

0

Проверить this example, но я бы сказал, что либо осколок onResume вызываются снова, или mLocationListener инстанцирование в onResume отличается от экземпляра, отменить регистрацию в . Это может помочь, если вы предоставите исходный код полного фрагмента. Чтобы убедиться, что экземпляр прослушивателя местоположения одинаков, сделайте сам фрагмент слушателем (путем реализации LocationListener) и зарегистрируйте/отмените регистрацию фрагмента (используя this).

+0

У меня журналы. Я печатаю каждый раз, когда вызывается вызовResume. Я вижу как onResume, так и onPause вызывается один раз. Также am toStringing слушателя в обоих методах перед вызовом removeUpdates и requestLocationUpdates – Amb

+0

Вы уже определили проблему самостоятельно. Слушатель, который вы регистрируете, отличается от слушателя, который вы регистрируете. Чтобы рассказать вам, почему мне нужно будет видеть код, но для его решения просто сделайте фрагмент сам слушателем, как я уже упоминал. –

+0

Я имел в виду, что у меня есть «toString()», чтобы прослушивать как в onPause, так и onResume. Слушатель одинаковый в обоих методах. Кроме того, я регистрируюся, когда создан слушатель. Я вижу, что слушатель создается только один раз. – Amb