2016-11-14 6 views
6

लीक मैं खेलने सेवाओं v9.8.0 उपयोग कर रहा हूँ (स्थान सेवा अनुमतियों के बिना) और अभी भी एक रिसाव का सामना करना पड़ रहा है जब मैं एक संवाद टुकड़ा में एक MapView का उपयोग करें। मैं इसे अपने कोड उदाहरण में उपयोग कर रहा हूं और मैं इसे केवल एक स्थान प्रदर्शित करने के लिए उपयोग करता हूं और मेरे पास setMyLocationEnabled नहीं है (क्योंकि मेरे पास इस सेटिंग के लिए अनुमति भी नहीं है)।MapView (स्थान सेवा के बिना) गतिविधि

क्या कोई मेरे कोड में कोई समस्या देखता है? मुझे यहां एक रिसाव मिल रहा है: MapView v2 keeping Context around। मैं निम्नलिखित है:

  • एक संवाद
  • बनाने (एक MapView के साथ अपने लेआउट में एक दृश्य की जगह क्योंकि मैं, साथ ही स्थिर नक्शे का उपयोग करें ताकि मेरे डिफ़ॉल्ट दृश्य मेरी लेआउट में एक ImageView है की अनुमति देते हैं, कि हो जाएगा एक MapView)

के साथ बदल दिया तो फिर ऐसा होता है मेरी टुकड़े लीक कि MapView.mContext ...

कोड - संवाद टुकड़ा

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

क्या आपने रिसाव शुरू करने के लिए लीक कैनरी का उपयोग करने का प्रयास किया है? – jakubbialkowski

+0

हां। लिंक के रूप में मुझे रिसाव श्रृंखला मिलती है जैसे "... माता-पिता संदर्भ फ़्रेमलेआउट। मानसिक संदर्भ MapView.mContext" ... – prom85

+0

क्या आपको पता चला? – Laurent

उत्तर

1

कुछ issues MapView साथ लीक के बारे में सूचना दी है। रिसाव होने से रोकने के लिए आप में googleMap.setMyLocationEnabled(false); पर कॉल करने का प्रयास कर सकते हैं। MapView.onDestroy या GoogleMap.setMyLocationEnabled(false) पर कॉल करने में विफलता रिसाव का कारण बन जाएगी। यहां एक संबंधित thread है जो सहायता कर सकता है।

+0

कॉलिंग 'setLocationEnabled' को स्थान की अनुमति की आवश्यकता है और मेरे ऐप में यह नहीं है इसलिए मैं इसे सक्षम नहीं कर सकता और न ही इसे अक्षम कर सकता हूं ... इसलिए यह मेरे लिए अब कोई समाधान नहीं है ... – prom85

0

मुझे एक ही समस्या थी, और मेरे ढेर संदर्भ पेड़ में एहसास हुआ कि बग पुस्तकालय के लाइट मोड भाग से आ रहा है। लाइट मोड का उपयोग न करने और मानचित्रदृश्य के लिए सभी संबंधित जीवन चक्र जोड़ने का प्रयास करें।

+1

क्या आप बता सकते हैं कि लाइट मोड के साथ आपका क्या मतलब है ? मेरे उदाहरण में मैं पहले से सोचने वाले सभी जीवन चक्र घटनाओं को जोड़ रहा हूं। या क्या मैं कुछ न कुछ भूल रहा हूं? – prom85

+0

@ prom85 [लाइट मोड डॉक] (https://developers.google.com/maps/documentation/android-api/lite) यह एक सुविधा है जो आपके द्वारा निर्दिष्ट स्थान के आपके टुकड़े पर बस एक बिटमैप प्रदर्शित करती है। यदि आपके पास नक्शा है तो अपने खंड xml की जांच करें: liteMode = "true" – sufeiz

संबंधित मुद्दे