2013-06-25 14 views
5

Ich benutze Bitmapfun Anwendung von Android zum Laden von Bitmaps effektiv.Aber manchmal ist ein Absturz bei BitmapFactory.decodeFileDescriptor() aufgetreten. Log cat und function ist unten angegeben. Crash tritt bei der return-Anweisung auf. Bitte helfen Sie mir. Vielen Dank im Voraus.Android Bitmpafun stürzt bei BitmapFactory.decodeFileDescriptor ab

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

Bitte helfen me.Application nicht läuft. – user1767260

Antwort

2

I verwendet BitMapFun und es tut mir leid, Ihnen zu sagen, dass dieses Projekt von Fehlern voll ist. Zum Beispiel tun sie in der AsyncTask setDrawable (..) nicht von UiThread und es funktioniert als eine Warteschlange von WeakReference. Das bedeutet, wenn der Benutzer schnell scrollt, dauert es lange, bis der Benutzer die Bilder sieht (abhängig von der Netzwerkstärke).

Über Ihren Fehler, in Android 2.1-2.3.7 gibt es einen Dalvik VM GC Bug, der nicht freien Speicherplatz im nativen Heap freigibt. Sie müssen recycle() auf Ihrem Bitmap und setDrawable (null) auf Ihrem imageView aufrufen, mit dem Aufruf von System.gc() sollte dieser Fehler behoben sein. Lass es mich wissen, wenn ich dir geholfen habe. Prost

+0

Ich habe dieses Problem seit Ewigkeiten, denkst du, du könntest mir dabei helfen? – Jack

+0

ja - lade das Projekt erneut herunter (sie haben ihn kürzlich aktualisiert) und in der Bitmap-Funktion zum Dekodieren (ImageUtils.java) - setze Optionen mit: o.inPurgeable; o.inInputteilbar; Es wird dem GC mehr Möglichkeiten beim Entfernen von Bitmap aus nativen Heap – Nativ

+0

Ich habe die neueste heute heruntergeladen, aber es heißt, Sie müssen es in Android Studio öffnen. Als ich es zum ersten Mal heruntergeladen habe, brauchte man kein Android-Studio, um es auszuführen, aber jetzt machst du es aus irgendeinem seltsamen Grund. – Jack

0

Ich traf die gleiche Situation mit Ihnen. Aber ich war absichtlich einige Daten, um diese Art von Situation zu produzieren. Der Grund ist, dass ich spezifiziert wurde

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

Ich absichtlich Grafikspeicher ist sehr groß, jenseits der Erinnerung an mein Set, ich hatte gehofft, Bild zeigt Unordnung zu erkennen, aber erscheint nicht, aber die Situation, die Sie kennen gelernt haben. Also ich schlage vor, Sie können Bilder komprimieren und kleinen Maßstab auf die IMG wie folgt setzen:

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

4

Ich hatte das gleiche Problem konfrontiert, wo ich löschte die Methode addInBitmapOptions um ImageResizer.java, und der Fehler wurde behoben.

+0

Das scheint zu stimmen. if (Utils.hashoneycomb()) { addInBitmapOptions (Optionen, Cache); } Ich habe Abstürze für Geräte mit 4.x –

+0

das Problem ist - sobald die Bilder gespeichert und im Cache gespeichert haben - ist es sicher, diese Zeile zu entfernen. jedoch - bei späteren Neuerstellungen (App zum Deinstallieren ziehen) - werden die Bilder jetzt nicht geladen. – johndpope

0

wenn Ihr Android-sdk> = 4.0 (oder über 4,0, ich bin nicht sicher) falsch ist, muss der options.inSampleSize sein 1.