2013-06-25 30 views
5

Sto usando l'applicazione Bitmapfun di Android per caricare in modo efficace i bitmap. Ma a volte si verifica un arresto anomalo su BitmapFactory.decodeFileDescriptor(). Il log cat e la funzione sono forniti di seguito.Curva si verifica nella dichiarazione di ritorno. Per favore aiutatemi. Grazie in anticipo.Android Bitmpafun si arresta in modo anomalo su 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

Aiutateci me.Application non è in esecuzione. – user1767260

risposta

2

Ho usato BitMapFun e mi dispiace dirvi che questo progetto è pieno di bug. Ad esempio nel AsyncTask stanno facendo setDrawable (..) non da UiThread e funziona come una coda di WeakReferance. Significa che se l'utente scorre velocemente verso il basso ci vorrà molto tempo prima che l'utente veda le immagini (dipende dalla forza della rete).

Informazioni sul bug, in Android 2.1-2.3.7 c'è un bug del GC VM Dalvik che non libera lo spazio allocato nell'heap nativo. Devi chiamare recycle() su yur bitmap e setDrawable (null) sul tuo imageView, con la chiamata a System.gc() questo bug dovrebbe essere risolto. Fammi sapere se ti ho aiutato. Cheers

+0

Ho riscontrato questo problema da anni, pensi che potresti darmi una mano? – Jack

+0

sì - scaricare nuovamente il progetto (lo hanno aggiornato di recente) e nella funzione di decodifica in bitmap (ImageUtils.java) - impostare le opzioni con: o.inPurgeable; o.inInputShareable; Concederà al GC più abillità nella rimozione di bitmap dall'heap nativo – Nativ

+0

Oggi ho scaricato quello più recente, ma si dice che è necessario aprirlo in Android Studio. Quando l'ho scaricato per la prima volta, non avevo bisogno di Android Studio per eseguirlo, ma ora lo fai per qualche strano motivo – Jack

0

Ho incontrato la stessa situazione con voi. Ma, ero volutamente dei dati per produrre questo tipo di situazione. Il motivo è che sono stato specificato

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

Ho deliberatamente la memoria grafica è molto grande, oltre la memoria del mio set, speravo di rilevare l'immagine mostra disordine, ma non appare, ma la situazione che hai incontrato. Quindi ti suggerisco di comprimere le immagini e impostare una scala ridotta su img in questo modo:

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

4

Avevo affrontato lo stesso problema, dove ho eliminato il metodo addInBitmapOptions allo e il bug è stato corretto.

+0

Questo sembra essere vero. if (Utils.hasHoneycomb()) { addInBitmapOptions (opzioni, cache); } Ho avuto un arresto anomalo per i dispositivi che eseguono 4.x –

+0

il problema è - una volta che le immagini sono state salvate e memorizzate nella cache su disco - è possibile rimuovere questa linea in modo sicuro. tuttavia - nelle ricostruzioni successive (trascinare l'app per disinstallare) - le immagini non verranno caricate. – johndpope

0

se il vostro Android SDK> = 4.0 (o superiore a 4,0, non sono sicuro) è falsa, l'options.inSampleSize deve essere 1.

Problemi correlati