2017-02-17 10 views
0

私は位置マネージャ(android.location.LocationManager)を使用するフラグメントを持っています。 mLocationManagerおよびmLocationListener(android.location.LocationListener)は、フラグメント化するプライベート変数です。 onPauseでLocationListenerが適切に処理されてもフラグメントに漏れている

onResumeで

()

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

()

mLocationManager.removeUpdates(mLocationListener); 
mLocationListener = null; 

私はABCLocationListenerのためのリークを取得しています。

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

私は何を確認しましたか?
1)作成されるABCLocationListenerオブジェクトのハッシュ値が0x33733270とは異なります。
2)onResumeメソッドとonPauseメソッドの両方が1回だけ呼び出されています。 removeUpdatesとrequestLocationUpdatesを呼び出す前に、これらのメソッドの両方で、リスナーのハッシュ値が

+0

このフラグメントの親のタイプ - ViewPagerまたはタブですか? また、毎回onResume()から新しいオブジェクトを作成することは避けてください。一度だけ作成して登録し、登録を解除してください。 –

答えて

0

チェックthis example同じですが、私はどちらかの断片のonResumeが再び呼び出されていると言うだろう、またはmLocationListenerあなたはonResumeでインスタンス化することで、登録解除インスタンスとは異なります。完全なフラグメントのソースコードを提供すると役に立ちます。位置リスナーのインスタンスが同じであることを確認するには、フラグメント自体をリスナー(LocationListenerを実装して)にし、フラグメントを登録/登録解除します(thisを使用)。

+0

私はログを持っています。 onResumeが呼び出されるたびに印刷します。私はonResumeとonPauseの両方が一度呼び出されるのを見る。また、removeUpdatesとrequestLocationUpdatesを呼び出す前に、両方のメソッドでリスナーをtoStringingしています – Amb

+0

あなた自身がすでに問題を特定しています。登録していないリスナーは、登録しているリスナーとは異なります。なぜ私はコードを見なければならないのかを教えてください。しかし、それを解決するには、既に言及したようにフラグメント自体をリスナーにしてください。 –

+0

私は、onPauseとonResumeの両方で "toString()"リスナーを持っていることを意味しました。リスナは両方のメソッドで同じです。また、私はwhereeverリスナーが作成されたログです。リスナーは一度だけ作成されています。 – Amb

関連する問題