2016-11-14 15 views
6

Używam usług odtwarzania v9.8.0 (bez uprawnień usługi lokalizacji) i nadal napotykam na przeciek, gdy używam MapView w fragmencie okna dialogowego. Używam go jak w moim przykładzie kodu i używam go do wyświetlania tylko lokalizacji i NIE mam setMyLocationEnabled (ponieważ nie mam nawet uprawnień dla tego ustawienia).Aktywność wycieków MapView (bez usługi lokalizacyjnej)

Czy ktoś widzi problem w moim kodzie? Dostaję wyciek taki jak tutaj: MapView v2 keeping Context around. Mam następujący:

  • stworzyć dialogowe
  • zastąpić widok w moim układzie z MapView (bo pozwalają używać map statycznych, tak więc mój widok domyślny jest ImageView w moim układzie, który będzie zastąpiony MapView)

Wtedy zdarza się, że moi fragmenty przecieki MapView.mContext ...

Code - Dialog Fragment

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; 
    } 
} 
+0

Czy próbowałeś użyć LeakCanary, aby wykryć miejsce rozpoczęcia wycieku? – jakubbialkowski

+0

Tak. Podobnie jak w linku otrzymuję łańcucha wycieków, jak "... mParent referencje FrameLayout.mParent referencje MapView.mContext" ... – prom85

+0

dowiedziałeś się? – Laurent

Odpowiedz

1

Istnieje około issues zgłoszonych wycieków z MapView. Możesz spróbować zadzwonić pod numer googleMap.setMyLocationEnabled(false); w onDestroy, aby zapobiec wyciekowi. Niepowodzenie wywołania MapView.onDestroy lub GoogleMap.setMyLocationEnabled(false) spowoduje wyciek. Oto powiązany thread, który może pomóc.

+0

Wywołanie "setLocationEnabled" wymaga pozwolenia lokalizacji, a moja aplikacja nie ma go, więc nie mogę go włączyć ani wyłączyć ... więc nie jest to dla mnie teraz rozwiązanie ... – prom85

0

Miałem ten sam problem i zrealizowałem w moim drzewie referencyjnym sterty, że błąd pochodzi z części biblioteki w trybie lite. Spróbuj nie używać trybu lite i dodawaj wszystkie odpowiednie cykle życia dla widoku mapy.

+1

Czy możesz wyjaśnić, co masz na myśli w trybie lite? ? W moim przykładzie dodam już wszystkie zdarzenia dotyczące cyklu życia. Czy może czegoś brakuje? – prom85

+0

@ Prom85 [Wersja uproszczona doc] (https://developers.google.com/maps/documentation/android-api/lite) Jest to funkcja wyświetlająca tylko bitmapę na fragmencie określonej lokalizacji. Sprawdź swój fragment xml, jeśli ma mapę: liteMode = "true" – sufeiz

Powiązane problemy