Saya ingin menunjukkan gambar Bitmap di ImageView dari kartu sd yang sudah disimpan. Setelah menjalankan aplikasi saya crash dan mendapatkan OutOfMemoryError kesalahan dari:
(java.lang.OutOfMemoryError: Gagal mengalokasikan alokasi 23970828 byte dengan 2097152 byte gratis dan 2MB hingga OOM)
Saya tidak tahu atau mengapa itu keluar dari memori. Saya pikir ukuran gambar saya sangat besar jadi saya mencoba mengubahnya.
Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
Object element = it.next();
String objElement = element.toString();
Log.e("objElement ", " = " + objElement);
final ImageView imageView = new ImageView (getContext());
final ProgressBar pBar = new ProgressBar(getContext(), null,
android.R.attr.progressBarStyleSmall);
imageView.setTag(it);
pBar.setTag(it);
imageView.setImageResource(R.drawable.img_placeholder);
pBar.setVisibility(View.VISIBLE);
if (objElement.endsWith(mp3_Pattern)) {
Log.e("Mp3 ", " ends with ");
pBar.setVisibility(View.GONE);
imageView.setImageResource(R.drawable.audio_control);
}
if (objElement.endsWith(png_Pattern)) {
Bitmap bitmap = BitmapFactory.decodeFile(objElement);
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
Log.e("bitmap_Resul "," = "+ bitmap_Resul);
if (bitmap_Resul != bitmap) {
bitmap.recycle();
}
imageView.setImageBitmap(bitmap_Resul);
Log.e("png_Pattern ", " ends with ");
Log.e(" bitmap "," = " + bitmap);
}
holder.linearLayout.addView(imageView);
holder.linearLayout.addView(pBar);
Informasi log kucing:
08-27 14:11:15.307 1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.tazeen.classnkk, PID: 1857
java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1659)
at android.widget.AbsListView.onLayout(AbsListView.java:2151)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
android
android-bitmap
androidTag
sumber
sumber
Jawaban:
OutOfMemoryError adalah masalah paling umum yang terjadi di android sementara terutama berurusan dengan bitmap. Kesalahan ini dilemparkan oleh Java Virtual Machine (JVM) ketika suatu objek tidak dapat dialokasikan karena kurangnya ruang memori dan juga, pengumpul sampah tidak dapat membebaskan beberapa ruang.
Seperti yang disebutkan oleh Aleksey, Anda dapat menambahkan entitas di bawah ini dalam file manifes Anda
android:hardwareAccelerated="false"
,android:largeHeap="true"
ini akan berfungsi untuk beberapa lingkungan.Anda harus benar-benar membaca beberapa konsep Pengembang Android, khususnya di sini: Menampilkan Bitmap dengan Efisien
Baca semua 5 topik dan tulis ulang kode Anda lagi. Jika masih tidak berfungsi, kami akan senang melihat kesalahan Anda dalam materi tutorial.
Di sini beberapa kemungkinan jawaban untuk jenis kesalahan dalam SOF ini
Android: BitmapFactory.decodeStream () kehabisan memori dengan file 400KB dengan tumpukan 2MB gratis
Bagaimana mengatasi masalah java.lang.OutOfMemoryError di Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Solusi untuk OutOfMemoryError: ukuran bitmap melebihi anggaran VM
Sunting: Dari komentar @cjnash
Bagi siapa pun yang masih mengalami crash setelah mereka menambahkan baris ini, coba tempel gambar Anda ke folder res / drawable-xhdpi / Anda alih-alih res / drawable / dan ini mungkin menyelesaikan masalah Anda.
sumber
Sudahkah Anda mencoba menambahkan ini ke manifes Anda di bawah aplikasi?
android:largeHeap="true"
?seperti ini
sumber
Bagi saya, masalahnya adalah bahwa file .png saya sedang de-kompresi menjadi bitmap yang sangat besar dalam memori, karena gambar memiliki dimensi yang sangat besar (walaupun ukuran file kecil).
Jadi perbaikannya adalah dengan hanya mengubah ukuran gambar :)
sumber
android:hardwareAccelerated="false"
, beberapa animasi seperti layout shadow tidak berfungsi. Tetapi setelah mengubah ukuran semua masalah diselesaikan, terima kasih! +1 untuk petunjuk ini!Sebenarnya Anda dapat menambahkan dalam manifes Anda baris ini
android:hardwareAccelerated="false"
,android:largeHeap="true"
ini berfungsi untuk beberapa situasi, tetapi perlu diketahui bahwa bagian lain dari kode dapat berdebat dengan ini.sumber
Ini seharusnya bekerja
sumber
Ubah ukuran gambar Anda sebelum mengatur ke ImageView seperti ini:
di mana ukuran adalah ukuran sebenarnya dari ImageView. Anda dapat mencapai ukuran dengan mengukur:
dan gunakan ukuran berikutnya
imageView.getMeasuredWidth()
danimageView.getMeasuredHeight()
untukscaling
.sumber
Gunakan Glide Library dan Override ukuran ke ukuran kurang;
sumber
Saya mendapat kesalahan di bawah ini
setelah menambahkan
android:largeHeap="true"
di AndroidManifest.xml maka saya menghilangkan semua kesalahansumber
Solusi: 1. buka file manifes Anda 2. di dalam tag aplikasi cukup tambahkan di bawah dua baris
Contoh:
sumber
Saya telah mengatasi masalah ini dengan mengubah ukuran gambar ke ukuran yang lebih rendah. Saya menggunakan formulir xamarin. mengurangi ukuran gambar PNG menyelesaikan masalah.
sumber
Saya telah menemukan bahwa gambar dalam folder 'drawable' akan dikonversi menjadi gambar yang jauh lebih besar pada ponsel berdefinisi tinggi. Sebagai contoh, gambar 200k akan diresampled ke resolusi yang lebih tinggi, seperti 800k atau 32000k. Saya harus menemukan ini sendiri dan sampai saat ini belum melihat dokumentasi untuk perangkap memori tumpukan ini. Untuk mencegah hal ini, saya meletakkan semuanya di folder drawable-nodpi (selain menggunakan 'opsi' di BitmapFactory berdasarkan tumpukan perangkat tertentu). Saya tidak mampu membuat ukuran aplikasi saya membengkak dengan beberapa folder yang dapat digambar, terutama karena rentang kekurangan layar sekarang sangat luas. Yang sulit adalah studio sekarang tidak secara khusus menunjukkan folder 'drawable-nodpi' seperti dalam tampilan proyek, itu hanya menunjukkan folder 'drawable'. Jika Anda tidak hati-hati, ketika Anda menjatuhkan gambar ke folder ini di studio, itu tidak akan
Pastikan untuk mengeklik ke bawah ke folder nodpi di dialog, karena tampilan proyek tidak akan menunjukkan semua folder yang dapat digambar secara terpisah seperti dulu, sehingga tidak akan langsung terlihat bahwa itu salah. Studio membuat ulang vanilla 'drawable' di beberapa titik bagi saya setelah saya menghapusnya sejak lama:
sumber
Ini bekerja untuk saya: hanya memindahkan gambar dari folder yang dapat ditarik ke drawable-hdpi.
sumber
Soluton coba ini di File Manifest Anda dan gunakan Glide Library
kompilasi 'com.github.bumptech.glide: glide: 3.7.0'
android: hardwareAccelerated = "false"
android: largeHeap = "true"
Gunakan perpustakaan ini
Ini Coding Selamat Bekerja
sumber
tambahkan ini ke manifes Anda di bawah aplikasi? android: largeHeap = "true"
sumber
Saya punya masalah juga.
Sama dengan kebanyakan orang lain di atas. Masalahnya disebabkan oleh gambar besar.
Ubah ukuran beberapa gambar, dan tidak perlu mengubah kode apa pun.
sumber
Dalam beberapa kasus (misalnya operasi dalam satu lingkaran) pengumpul sampah lebih lambat dari kode Anda. Anda dapat menggunakan metode pembantu dari jawaban ini untuk menunggu pengumpul sampah .
sumber
Saya seorang pemula dalam pengembangan Android tapi saya harap solusi saya membantu, ini berfungsi dengan baik pada kondisi saya. Saya menggunakan Imageview dan mengatur latar belakangnya menjadi "src" karena saya mencoba membuat bingkai animasi. Saya mendapat kesalahan yang sama tetapi ketika saya mencoba kode ini berhasil
sumber
Saya mengalami masalah ini ketika saya tidak mematikan aktivitas lama saya ketika pindah ke aktivitas baru. Saya memperbaikinya dengan
finish();
sumber
50/100 jika seseorang menggunakan 100 maka resolusi asli dapat menghentikan Aplikasi karena kehabisan memori.
jika 50 atau kurang dari 100 ini akan menjadi 50% atau kurang dari 100 resolusi sehingga ini akan mencegah masalah memori
sumber
Anda harus mengubah ukuran objek dalam gambar. Terlalu besar untuk ditampilkan oleh android. mis. Jika Anda mengatur gambar coba gambar dengan piksel lebih sedikit. Ini bekerja untuk saya. Terima kasih. :)
sumber
Aplikasi Anda mogok karena ukuran gambar Anda (dalam MB atau KB) terlalu besar sehingga tidak mengalokasikan ruang untuk itu. Jadi sebelum menempelkan gambar Anda di drawable, kurangi saja ukurannya.
ATAU
Anda dapat menambahkan tag aplikasi Mengikuti di Manifest.xml
Setelah Menambahkan Aplikasi ini tidak akan Hancur.
sumber
Masalah saya terpecahkan setelah menambahkan
dalam file Build.Gradle
sumber
sumber
Jika mengunggah gambar, coba kurangi kualitas gambar, yang merupakan parameter kedua dari Bitmap. Ini adalah solusi dalam kasus saya. Sebelumnya itu 90, kemudian saya coba dengan 60 (seperti pada kode di bawah sekarang).
sumber
Coba yang paling sederhana. Mungkin aplikasi Anda mogok karena ukuran gambar Anda (dalam MB) terlalu besar sehingga tidak mengalokasikan ruang untuk itu. Jadi sebelum menempelkan gambar Anda di drawable, kurangi ukurannya dengan perangkat lunak viewer apa pun atau jika Anda mengambil gambar dari galeri saat run time daripada sebelum menyimpannya, kompres bitmap Anda. Ini berhasil untuk saya. pasti untuk kamu akan.
sumber
Kemudian dalam tag Appliaction, tambahkan bigheapsize = "true
sumber
Saya kira Anda ingin menggunakan gambar ini sebagai ikon. Seperti yang diberitahukan Android kepada Anda, gambar Anda terlalu besar. Yang perlu Anda lakukan adalah skala gambar Anda sehingga Android tahu ukuran gambar yang digunakan dan kapan sesuai dengan resolusi layar. Untuk mencapai ini, di Android Studio: 1. klik kanan pada folder res, 2. pilih Image Asset 3. Pilih ikon Type 4. Beri ikon nama 5. Pilih Image on Asset Type 6. Trim gambar Anda Klik next dan selesai . Di xml atau kode sumber Anda cukup merujuk ke gambar yang sekarang akan berada baik di tata letak atau folder mipmap sesuai dengan jenis aset yang dipilih. Kesalahan akan hilang.
sumber
Saya tidak merekomendasikan pengeditan manifes seperti ini
Opsi ini menyebabkan efek animasi tidak lancar pada aplikasi Anda. Selain itu 'liveData' atau mengubah DB lokal Anda (Sqlite, Room) aktifkan secara perlahan. Ini buruk untuk pengalaman pengguna.
Jadi saya sarankan RESIZE bitmap
Di bawah ini adalah kode sampel
sumber
Jika android: largeHeap = "true" tidak berfungsi untuk Anda
1:
2:
Jangan hapus android: largeHeap = "true"!
sumber
Gunakan perpustakaan pemuatan gambar seperti Picasso atau Glide . Menggunakan perpustakaan ini akan mencegah crash di masa depan.
sumber