Я использую службы воспроизведения v9.8.0 (без разрешений на предоставление услуг определения местоположения), и я все еще сталкиваюсь с утечкой, когда использую MapView
в фрагменте диалога. Я использую его, как в моем примере кода, и использую его для отображения только местоположения, и у меня нет setMyLocationEnabled
(так как у меня даже нет разрешений для этого параметра).Активность активности MapView (без службы определения местоположения)
Кто-нибудь видит проблему в моем коде? Я получаю утечку, как здесь: MapView v2 keeping Context around. Я следующее:
- создать диалоговые
- заменить вид на моем макете с
MapView
(потому что позволяют использовать статические карты, так что мое мнение по умолчанию в моем макетеImageView
, что будет замененMapView
)
Тогда случается, что мои фрагменты просачивается MapView.mContext
...
код - Dialog Фрагмент
public class DialogMediaDetails extends DialogFragment
{
private GoogleMap mGoogleMap = null;
private MapView mMapView = null;
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState)
{
Dialog dlg = ...; // create dialog
View view = ...; // get view from dialog
Location location = ...; // defined location
initGoogleMap();
return dlg;
}
private void initGoogleMap(Location location)
{
mMapView = new MapView(getActivity());
MapsInitializer.initialize(getActivity());
// Updates the location and zoom of the MapView
mMapView.onCreate(null);
mMapView.getMapAsync(new OnMapReadyCallback()
{
@Override
public void onMapReady(GoogleMap googleMap)
{
LatLng coordinates = new LatLng(location.getLatitude(), location.getLongitude());
googleMap.addMarker(new MarkerOptions().position(coordinates));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 15));
mGoogleMap = googleMap;
mMapView.onResume();
}
});
mMapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{
@Override
public void onGlobalLayout()
{
mMapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// MapView is scrollable, so we disable dragging
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(AppBarLayout appBarLayout) {
return false;
}
});
}
});
replaceHeader(mMapView);
}
private void replaceHeader(View view)
{
ViewGroup parent = (ViewGroup) pbHeader.getParent();
int index = parent.indexOfChild(pbHeader);
ViewGroup.LayoutParams lp = pbHeader.getLayoutParams();
parent.removeView(pbHeader);
parent.addView(view, index, lp);
}
// ----------------------------------------
// forward all lifecycle events to MapView
// ----------------------------------------
@Override
public void onResume() {
super.onResume();
if (mMapView != null)
mMapView.onResume();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mMapView != null)
mMapView.onSaveInstanceState(outState);
}
@Override
public void onPause() {
super.onPause();
if (mMapView != null)
mMapView.onPause();
}
@Override
public void onLowMemory() {
super.onLowMemory();
if (mMapView != null)
mMapView.onLowMemory();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mMapView != null)
mMapView.onDestroy();
mMapView = null;
}
}
Вы пытались использовать LeakCanary, чтобы определить, где началась утечка? – jakubbialkowski
Да. Как и в ссылке, я получаю цепочку утечки, например «... mParent ссылки FrameLayout.mParent ссылки MapView.mContext" ... – prom85
Вы узнали? – Laurent