2013-07-16 26 views
6

Ho cercato di aggirare la decodifica del file immagine, ma non riesce a rilevare l'eccezione di memoria insufficiente e l'app si arresta in modo anomalo.È possibile che venga rilevata un'eccezione di memoria in Android nell'allocazione Bitmap per la decodifica di un file di immagine?

Conosco alcuni trucchi per decodificare un file di immagine, come il sottocampionamento. Ma ho bisogno di ingrandire l'immagine per vedere i dettagli, quindi non posso sottometterla troppo. Per alcuni dispositivi più recenti, può riuscire a allocare una memoria più grande per evitare l'eccezione di memoria insufficiente.

Per alcuni dispositivi meno recenti, non è possibile.

Se riesco a personalizzare la mia applicazione per diversi dispositivi, sarebbe fantastico.

Quindi voglio: (1) Spero di poter catechare l'eccezione di memoria insufficiente, quindi nel caso in cui lo prendo, posso ridurre le dimensioni dell'immagine. (2) Oppure, spero di poter ottenere la dimensione della memoria disponibile per l'allocazione.

I ricerca in linea, non riesce a trovare le risposte.

+0

Ricordate che, anche se si cattura con successo l'OutOfMemoryException, non si è ancora poca memoria, e non c'è alcuna garanzia che la vostra attività o la Dalvik VM non avrebbe fatto qualcosa per spingere la memoria oltre il limite di nuovo, a quel punto l'eccezione può essere gettato da letteralmente ovunque. Anche se sembra funzionare sui dispositivi che hai provato, sarebbe comunque una pratica molto pericolosa. – Kai

+0

Innanzitutto, essere in grado di catturare l'eccezione OutOfMemroy, non causa l'arresto anomalo dell'app, che è quello che desideravo. In secondo luogo, se a un certo punto e per qualche dispositivo, può allocare una grande quantità di memoria, vorrei lasciare che l'utente abbia una migliore esperienza d'uso, ma è comunque utile; nel caso la memoria sia limitata, allora lascerò abbassare la risoluzione. In ogni caso, è utile citare o conoscere il problema della memoria. – user1914692

risposta

5

Innanzitutto, è possibile vedere nella traccia dello stack in cui è stato lanciato l'errore OutOfMemoryError. Se non l'hai preso, è perché a) stai rilevando Eccezione anziché Throwable, oppure b) l'errore è stato generato da qualche altra parte rispetto a dove hai avuto la dichiarazione di cattura. Con OutOfMemoryError non puoi garantire dove verrà lanciato. Di solito è dove si ha a che fare con la bitmap, ma potrebbe essere un altro thread che capita di allocare memoria allo stesso tempo.

Ottenere la memoria disponibile sul dispositivo è banale: http://developer.android.com/reference/android/app/ActivityManager.html#getMemoryClass()

Il team di Android ha una grande serie di articoli su bitmap e memoria, se non li avete ancora visto: http://developer.android.com/training/displaying-bitmaps/index.html

Buona fortuna!

+0

Grazie! Ho preso Throwable. – user1914692

+1

come hai fatto a prendere throwable –

+0

Credo che lui catturato proprio come eccezione: provare { } catch (t Throwable) { t.printStackTrace(); } – tritop