2015-07-10 8 views
12

Obrazy są ładowane do widoku siatki z serwera. Do tego używam programu Universal Image loader. Używam programu ładującego obrazy w metodzie getview() adaptera. Bierze adres URL obrazu z tablicy array & ładuje obraz z serwera. Obrazy mogą być w 100-tych. Wyświetlam widok siatki w fragmencie, więc dla każdego fragmentu istnieje osobny widok siatki. Kiedy przełączam się między wieloma fragmentami przez długi czas, nie mam już problemu z brakiem pamięci.Jak zwolnić pamięć bitmapy za pomocą mechanizmu imageloader w systemie Android?

Proponowane rozwiązanie:

  1. Release niewykorzystanej bitmapy.

Dlatego ładuję obrazy przy użyciu biblioteki innej firmy. Właśnie przekazuję widok obrazu w funkcji wywołującej, więc jak mogę zwolnić bitmapę?

  1. Producent kupa duża prawda w jawnym

Chyba pamięci sterty jest dynamiczna & ilekroć jest zwiększenie pamięci garbage collector będzie zwolnić pamięć.

3.Use UIL/Picassa/przesuwaj uniknąć pamięci przecieki

4.Code zwolnić pamięć onDestroy fragment()() w

private void unbindDrawables(View view) 
{ 
     if (view.getBackground() != null) 
     { 
       view.getBackground().setCallback(null); 
     } 
     if (view instanceof ViewGroup && !(view instanceof AdapterView)) 
     { 
       for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) 
       { 
         unbindDrawables(((ViewGroup) view).getChildAt(i)); 
       } 
       ((ViewGroup) view).removeAllViews(); 
     } 
} 

ja już z trzecią biblioteka imprezowa.

Oto kod dla mojej klasy gridViewAdapter.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     View view = convertView; 
     if (view == null) 
     { 
      view = inflater.inflate(R.layout.grid_item_photo, parent, false); 
      holder = new ViewHolder(); 
      holder.imageView = (ImageView) view.findViewById(R.id.imgLoader); 
      holder.play = (ImageView) view.findViewById(R.id.play); 


      view.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder) view.getTag(); 
     } 
     try{ 
     if(IMAGES_LIST.get(position).getType().equals("video")) 
     { 
     holder.play.setVisibility(View.VISIBLE); 
     } 
     else 
     { 
     holder.play.setVisibility(View.GONE); 

     } 
     ImageLoader.getInstance().displayImage(AppConst.BASE_IMAGE_URL+IMAGES_LIST.get(position).getThumbnail(), holder.imageView, options, new SimpleImageLoadingListener() { 
        @Override 
        public void onLoadingStarted(String imageUri, View view) { 
         view.setClickable(true); 
        } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
         view.setClickable(true); 

        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
         view.setClickable(false); 

        } 
       }, new ImageLoadingProgressListener() { 
        @Override 
        public void onProgressUpdate(String imageUri, View view, int current, int total) { 

        } 
       }); 
     }catch(Exception e) 
     { 

     } 
     catch(OutOfMemoryError e) 
     { 

     } 
     return view; 
    } 
    static class ViewHolder { 
     ImageView imageView,play; 

    } 


} 
+0

Na której wersji Androida uruchamiasz aplikację? – TechGuy

+0

@TechGuy andorid kitkat – Techiee

+0

Słyszałem, że zarządzanie pamięcią jest różne w każdej wersji Androida. i użyj buforowania obrazu dla wydajności. – Hogun

Odpowiedz

4

Yo można usunąć z pamięci podręcznej obraz w pamięci podręcznej. Użyj MemoryCacheUtil za to:

MemoryCacheUtils.removeFromCache(imageUrl, imageLoader.getMemoryCache()); 

And DiscCacheUtils do usuwania discCache

DiscCacheUtils.removeFromCache(url, ImageLoader.getInstance().getDiscCache()); 

Poza tym, można wyczyścić pamięć cache przy użyciu:

imageLoader.clearMemoryCache(); 

Ponadto, można kontrolować pamięć i dysk z granice:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())   
     .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) 
     .discCache(new UnlimitedDiscCache(cacheDir)) 
+0

dlaczego ten problem występuje? @jiopez – Techiee

+0

Nie jestem cahing obrazów i jak również nie buforowanie na dysku. @jlopez – Techiee

+0

obrazy są buforowane dynamicznie, aby uniknąć pobierania obrazu za każdym razem – jlopez

1

Może to być powód, dla którego po prostu używasz ImageLoader, tworząc jego instancję, a także nie wiem o DisplayImageOptions, co masz. Spróbuj zmienić ustawienia opcji i sprawdź to. Dla mnie te opcje ułatwiają ładowanie duże obrazy w List.

Spróbuj tej opcji w aplikacji.

DisplayImageOptions imageOptions = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_launcher).showImageOnFail(R.drawable.ic_launcher).resetViewBeforeLoading(true).cacheOnDisk(true).imageScaleType(ImageScaleType.EXACTLY).bitmapConfig(Bitmap.Config.RGB_565).considerExifParams(true).displayer(new FadeInBitmapDisplayer(3000, true, true, false)).build(); 
6
  1. Brzmi jak twoje fragmenty przeciekać - Twój fragment pozostaje w pamięci z całą ich zawartością (w tym mapa bitowa), nawet jeśli onDestroy nazywa.Możesz użyć MAT + Heap zrzuca, zobaczyć, co dokładnie powoduje wyciek (dostępnych jest wiele przewodników). Pierwszymi podejrzanymi powinni być Singletonowie z klas fragmentów, które przekazujesz "to" ze swoich fragmentów. Pierwszym krokiem byłoby oczyszczenie wszystkiego z twojego fragmentu w OnDestroy.

  2. Wykonaj "SimpleImageLoadingListener()" wewnętrzną klasę statyczną, która przechowuje twój fragment jako WeakReference - prawdopodobnie zmniejszy to wyciek (lub przynajmniej jeden z nich).

  3. Powinieneś używać dowolnego 3rd ImageLoader jako Singleton z jedną pamięcią podręczną LRU + jedną pamięcią podręczną dysku. Możesz znaleźć kilka dobrych tutaj (Any best third party tool to cache image in Android?)

  4. "largeHeap" w manifeście nie powinno być w twoim umyśle w ogóle. Gdy pojawi się wyciek, będziesz mieć większą stertę do wypełnienia aż do OOM.

1

Możesz spróbować uniknąć pamięci podręcznej i ograniczyć pamięć podręczną dysku. W celu dalszej optymalizacji możesz sprawdzić the source.

Powiązane problemy