tôi có một ứng dụng Android với 3 acitivtys:Out of Memory Lỗi trong khi tải bitmap
A1 - bắt đầu -> A2 - bắt đầu -> A3 - khi hoàn tất quá trình của mình: bắt đầu -> A1
(vì vậy tôi làm không phải là "kết thúc();". ứng dụng tôi bắt đầu activitys tiếp theo với "startActivity (..);" trong suốt thời gian sau khi userinteraction)
nên có một vòng lặp trong 3 hoạt động này. Trên mỗi hoạt động, tôi hiển thị 3-9 hình ảnh, nằm trên thẻ SD, mà tôi tải với chức năng sau đây của tôi:
try
{
Uri selectedImageURI = Uri.parse(strImagePath);
File imgFile = new File(getRealPathFromURI(selectedImageURI, c));
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ivTmp.setImageBitmap(myBitmap);
}catch (Exception e)
{
return null;
}
này tất cả các công trình. Nhưng đôi khi (sau khi lặp một vài lần qua activitys của tôi), treo ứng dụng của tôi ..
Logcat nói với tôi:
01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms
01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation.
01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
at android.content.res.Resources.loadDrawable(Resources.java:1965)
at android.content.res.Resources.getDrawable(Resources.java:660)
at android.widget.ImageView.resolveUri(ImageView.java:616)
at android.widget.ImageView.setImageResource(ImageView.java:349)
at <MyApp>.MyActivity$6.run(MyActivity.java:143)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Ai đó có thể đưa ra một số lời khuyên của tôi làm thế nào để xử lý các tai nạn? Có thể vì hoạt động của tôi được đặt thành trạng thái "bị tạm dừng" thay vì đóng chúng chính xác?
thử gọi .recycle() trên bitmap của bạn trong OnPause(). và tải chúng trong onResume() không onCreate(). – pumpkee
là nó có thể làm điều này một cách tốt hơn? giống như, nếu tất cả các bitmap của tôi nằm trong linearlayout, sau đó gọi llMain.recycle() hoặc một cái gì đó như thế? – Prexx
Bạn có thể tạo một ArrayList mà bạn thêm mỗi bitmap mà bạn tải và tái chế lặp qua đó. Một điều chung khác: Chơi với kích thước mẫu của hình ảnh. Không biết ứng dụng của bạn là gì nhưng chỉ đơn giản là hiển thị bitmap trên màn hình hầu hết thời gian nó vẫn còn sufficiant để mẫu chúng xuống và tiết kiệm bộ nhớ. Xem: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html –
pumpkee