Ich habe eine ListView
mit ein paar Bildschaltflächen in jeder Zeile. Wenn der Benutzer auf die Listenzeile klickt, wird eine neue Aktivität gestartet. Aufgrund eines Problems mit dem Kamera-Layout musste ich meine eigenen Registerkarten erstellen. Die Aktivität, die für das Ergebnis gestartet wird, ist eine Karte. Wenn ich auf meine Schaltfläche klicke, um die Bildvorschau zu starten (Laden eines Bildes von der SD-Karte), kehrt die Anwendung von der Aktivität zurück zur ListView
Aktivität zum Ergebnis-Handler, um meine neue Aktivität, die nichts anderes als ein Bild-Widget ist, neu zu starten.
Die Bildvorschau auf der Seite ListView
wird mit dem Cursor durchgeführt und ListAdapter
. Dies macht es ziemlich einfach, aber ich bin mir nicht sicher, wie ich ein verkleinertes Bild (d.h. kleinere Bitgröße nicht Pixel als die src
für die Bild-Schaltfläche im laufenden Betrieb. Also habe ich einfach die Größe des Bildes, das von der Handykamera kam, geändert.
Das Problem ist, dass ich eine OutOfMemoryError
wenn er versucht, zurückzugehen und die 2. Aktivität erneut zu starten.
- Gibt es eine Möglichkeit, den Listenadapter einfach zeilenweise zu erstellen, wobei ich die Größe während des Betriebs ändern kann ( bitweise )?
Dies wäre wünschenswert, da ich auch einige Änderungen an den Eigenschaften der Widgets/Elemente in jeder Zeile vornehmen muss, da ich aufgrund des Fokusproblems nicht in der Lage bin, eine Zeile mit dem Touchscreen auszuwählen. ( Ich kann Rollerball verwenden. )
- Ich weiß, dass ich die Größe außerhalb des Bandes ändern und mein Bild speichern kann, aber das ist nicht wirklich das, was ich tun möchte, aber ein Beispielcode dafür wäre schön.
Sobald ich das Bild auf dem Bildschirm deaktiviert habe ListView
hat es wieder gut funktioniert.
Zu Ihrer Information: So habe ich es gemacht:
String[] from = new String[] { DBHelper.KEY_BUSINESSNAME, DBHelper.KEY_ADDRESS,
DBHelper.KEY_CITY, DBHelper.KEY_GPSLONG, DBHelper.KEY_GPSLAT,
DBHelper.KEY_IMAGEFILENAME + ""};
int[] to = new int[] { R.id.businessname, R.id.address, R.id.city, R.id.gpslong,
R.id.gpslat, R.id.imagefilename };
notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
どこ R.id.imagefilename
es un ButtonImage
.
Hier ist mein LogCat:
01-25 05:05:49.877: ERROR/dalvikvm-heap(3896): 6291456-byte external allocation too large for this process.
01-25 05:05:49.877: ERROR/(3896): VM wont let us allocate 6291456 bytes
01-25 05:05:49.877: ERROR/AndroidRuntime(3896): Uncaught handler: thread main exiting due to uncaught exception
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:304)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:149)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:174)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.graphics.drawable.Drawable.createFromPath(Drawable.java:729)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ImageView.resolveUri(ImageView.java:484)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ImageView.setImageURI(ImageView.java:281)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:183)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:129)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.CursorAdapter.getView(CursorAdapter.java:150)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.AbsListView.obtainView(AbsListView.java:1057)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.makeAndAddView(ListView.java:1616)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.fillSpecific(ListView.java:1177)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.ListView.layoutChildren(ListView.java:1454)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.AbsListView.onLayout(AbsListView.java:937)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.onLayout(LinearLayout.java:922)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.FrameLayout.onLayout(FrameLayout.java:294)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:999)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.LinearLayout.onLayout(LinearLayout.java:920)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.widget.FrameLayout.onLayout(FrameLayout.java:294)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.View.layout(View.java:5611)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.ViewRoot.performTraversals(ViewRoot.java:771)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.view.ViewRoot.handleMessage(ViewRoot.java:1103)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.os.Handler.dispatchMessage(Handler.java:88)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.os.Looper.loop(Looper.java:123)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at android.app.ActivityThread.main(ActivityThread.java:3742)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at java.lang.reflect.Method.invokeNative(Native Method)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at java.lang.reflect.Method.invoke(Method.java:515)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
01-25 05:05:49.917: ERROR/AndroidRuntime(3896): at dalvik.system.NativeStart.main(Native Method)
01-25 05:10:01.127: ERROR/AndroidRuntime(3943): ERROR: thread attach failed
Ich habe auch einen neuen Fehler beim Anzeigen eines Bildes:
22:13:18.594: DEBUG/skia(4204): xxxxxxxxxxx jpeg error 20 Improper call to JPEG library in state %d
22:13:18.604: INFO/System.out(4204): resolveUri failed on bad bitmap uri:
22:13:18.694: ERROR/dalvikvm-heap(4204): 6291456-byte external allocation too large for this process.
22:13:18.694: ERROR/(4204): VM won't let us allocate 6291456 bytes
22:13:18.694: DEBUG/skia(4204): xxxxxxxxxxxxxxxxxxxx allocPixelRef failed
9 Stimmen
Ich löste dies, indem ich Bitmap.decodeStream oder decodeFile vermied und die Methode BitmapFactory.decodeFileDescriptor verwendete.
2 Stimmen
Ich auch konfrontiert ähnliches Problem paar Wochen zurück und ich löste es durch Skalierung Bilder bis zu optimalen Punkt. Ich habe komplette Ansatz in meinem Blog geschrieben codingjunkiesforum.wordpress.com/2014/06/12/ und lud ein komplettes Beispielprojekt mit OOM-anfälligem Code im Vergleich zu OOM-Proof-Code aufhttps://github.com/shailendra123/BitmapHandlingDemo hoch.
2 Stimmen
Vollständige Lösung .. stackoverflow.com/a/24135283/294884
6 Stimmen
Die akzeptierte Antwort auf diese Frage wird diskutiert auf meta
2 Stimmen
Diesen Blogpost lesen codingaffairs.blogspot.com/2016/07/
5 Stimmen
Dies geschieht aufgrund der schlechten Android-Architektur. Es sollte die Größe der Bilder selbst wie ios und UWP tut dies. Ich muss diese Dinge nicht selbst tun. Android-Entwickler gewöhnen sich an diese Hölle und denken, es funktioniert so, wie es sollte.
0 Stimmen
Als ich das letzte Mal mit Android zu tun hatte (vor Jahren), war dies immer noch ein ungelöstes Problem, selbst MIT Resampling, Caching, manuellem Recycling, gc() und größeren Heap-Größen - sie verschieben das Problem nur weiter nach hinten und können nicht alle immer verwendet werden: stackoverflow.com/questions/8240502 und kann nicht behoben werden, da Bitmap eine endgültige Klasse ist.
0 Stimmen
@kaay Ich sehe keine Probleme mehr damit... Eigentlich seit ich das gelernt habe, habe ich keine OOM auf Android erlebt...