2013-06-25 6 views
5

Używam aplikacji Bitmapfun Androida do efektywnego ładowania bitmap. Czasami zdarza się awaria w BitmapFactory.decodeFileDescriptor(). Log cat i funkcja jest podana poniżej. Kash występuje w instrukcji return. Proszę mi pomóc. Dzięki za to.Android Bitmpafun ulega awarii w BitmapFactory.decodeFileDescriptor

public static Bitmap decodeSampledBitmapFromDescriptor(
     FileDescriptor fileDescriptor, int reqWidth, int reqHeight, ImageCache cache) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 

    // If we're running on Honeycomb or newer, try to use inBitmap 
    if (Utils.hasHoneycomb()) { 
     addInBitmapOptions(options, cache); 
    } 

    return BitmapFactory.decodeFileDescriptor(fileDescriptor, null, options); 
} 

Logcat

06-25 14:20:56.055: E/AndroidRuntime(5978): FATAL EXCEPTION: AsyncTask #3 
06-25 14:20:56.055: E/AndroidRuntime(5978): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.AsyncTask$3.done(AsyncTask.java:325) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.lang.Thread.run(Thread.java:856) 
06-25 14:20:56.055: E/AndroidRuntime(5978): Caused by: java.lang.IllegalArgumentException: Problem decoding into existing bitmap 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at android.graphics.BitmapFactory.decodeFileDescriptor(BitmapFactory.java:664) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.ImageResizer.decodeSampledBitmapFromDescriptor(ImageResizer.java:196) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.ImageFetcher.processBitmap(ImageFetcher.java:242) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.ImageFetcher.processBitmap(ImageFetcher.java:255) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:326) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:1) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at com.vbk.vobok.util.AsyncTask$2.call(AsyncTask.java:313) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
06-25 14:20:56.055: E/AndroidRuntime(5978):  ... 4 more 
+0

Proszę o pomoc me.Application nie jest uruchomiony. – user1767260

Odpowiedz

2

użyłem BitMapFun i przykro mi powiedzieć, że ten projekt jest pełna błędów. Na przykład w AsyncTask robią setDrawable (..) nie z UiThread i działa jako kolejka WeakReferance. Oznacza to, że jeśli użytkownik przewinie szybko w dół, zajmie dużo czasu, zanim użytkownik zobaczy obrazy (zależnie od siły sieci).

O błędzie, w systemie Android 2.1-2.3.7 występuje błąd Dalvik VM GC, który nie zwalnia przydzielonej przestrzeni w macierzystej sterty. Musisz wywołać funkcję recycle() na yur bitmap i setDrawable (null) na swoim imageView, z wywołaniem System.gc() ten błąd powinien zostać rozwiązany. Daj mi znać, jeśli ci pomogę. Na zdrowie

+0

Mam problem przez wieki, myślisz, że możesz mi pomóc z tym? – Jack

+0

tak - pobierz ponownie projekt (zaktualizowali go ostatnio) oraz w funkcji dekodowania do bitmapy (ImageUtils.java) - ustaw opcje za pomocą: o.inPurgeable; o.inInputShareable; Pozwoli to GC na większą liczbę operacji usuwania bitmapy z macierzystego sterty – Nativ

+0

Dzisiaj pobrałem najnowszą wersję, ale jest napisane, że musisz ją otworzyć w studiu Android. Kiedy po raz pierwszy go pobrałem, nie musiałem go uruchamiać na Androidzie, ale teraz robisz z jakiegoś dziwnego powodu. – Jack

0

Spotkałem się z Tobą w podobnej sytuacji. Ale umyślnie podałem jakieś dane, by wytworzyć taką sytuację. Powodem jest to, że został określony

mImageFetcher = nowy ImageFetcher (getActivity(), 1024, 683);

Rozmyślnie grafika pamięci jest bardzo duża, poza pamięcią mojego zestawu, miałem nadzieję wykryć nieporządek pokazów obrazów, ale nie pojawia się, ale sytuacja, z którą się spotkałeś. Sugeruję więc, że możesz kompresować obrazy i ustawiać na małą skalę: img:

mImageFetcher = new ImageFetcher (getActivity(), 100,100);

4

Miałem do czynienia z tym samym problemem, gdzie w I usunąłem metodę addInBitmapOptions pod ImageResizer.java, a błąd został naprawiony.

+0

To wydaje się być prawdą. if (Utils.hasHoneycomb()) { addInBitmapOptions (opcje, pamięć podręczna); } Mam awarie urządzeń obsługujących 4.x –

+0

problem polega na tym, że - po zapisaniu i zapisaniu w pamięci podręcznej na dysku - można bezpiecznie usunąć tę linię. jednak - przy późniejszych przebudowach (przeciąganie aplikacji do deinstalacji) - obrazy nie będą się ładować. – johndpope

0

jeśli android sdk> = 4.0 (lub powyżej 4,0, nie jestem pewien) jest fałszywe, options.inSampleSize musi być 1.

Powiązane problemy