我的应用有时会因outOfMemoryError崩溃。我试图优雅地处理它而不是崩溃应用程序。这是错误的Logcat,然后是我的try / catch块:
编辑这个问题是关于异常处理,而不是有效地显示图像。我在装载时将图像采样到有效尺寸。但是在旧手机上它仍然可能会崩溃,因为用户可以手动将图像添加到活动中。我想要一条消息说他们已经添加了他们的限制而不是崩溃。谢谢。
02-14 09:46:11.833: E/dalvikvm-heap(8495): Out of memory on a 2424016-byte allocation.
02-14 09:46:11.833: I/dalvikvm(8495): "main" prio=5 tid=1 RUNNABLE
02-14 09:46:11.833: I/dalvikvm(8495): | group="main" sCount=0 dsCount=0 obj=0x40fc3508 self=0x40fb2ff8
02-14 09:46:11.833: I/dalvikvm(8495): | sysTid=8495 nice=0 sched=0/0 cgrp=apps handle=1074818864
02-14 09:46:11.838: I/dalvikvm(8495): | schedstat=( 10854840575 3262089934 15014 ) utm=971 stm=113 core=1
02-14 09:46:11.838: I/dalvikvm(8495): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-14 09:46:11.838: I/dalvikvm(8495): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:625)
02-14 09:46:11.838: I/dalvikvm(8495): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:478)
02-14 09:46:11.838: I/dalvikvm(8495): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:501)
02-14 09:46:11.838: I/dalvikvm(8495): at com.btf271.imagehelper.ImageHelper.decodeSampledBitmapFromResource(ImageHelper.java:218)
02-14 09:46:11.838: I/dalvikvm(8495): at com.btf271.multitouchimages.MultitouchImagesView$Img.load(MultitouchImagesView.java:285)
02-14 09:46:11.838: I/dalvikvm(8495): at com.btf271.multitouchimages.MultitouchImagesView.loadImages(MultitouchImagesView.java:134)
02-14 09:46:11.838: I/dalvikvm(8495): at com.btf271.fashionassistant.DressingRoomActivity.onResume(DressingRoomActivity.java:125)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1199)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.Activity.performResume(Activity.java:5280)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2629)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2667)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1279)
02-14 09:46:11.843: I/dalvikvm(8495): at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 09:46:11.843: I/dalvikvm(8495): at android.os.Looper.loop(Looper.java:137)
02-14 09:46:11.843: I/dalvikvm(8495): at android.app.ActivityThread.main(ActivityThread.java:4921)
02-14 09:46:11.843: I/dalvikvm(8495): at java.lang.reflect.Method.invokeNative(Native Method)
02-14 09:46:11.843: I/dalvikvm(8495): at java.lang.reflect.Method.invoke(Method.java:511)
02-14 09:46:11.843: I/dalvikvm(8495): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
02-14 09:46:11.843: I/dalvikvm(8495): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
02-14 09:46:11.843: I/dalvikvm(8495): at dalvik.system.NativeStart.main(Native Method)
02-14 09:46:11.843: A/libc(8495): Fatal signal 11 (SIGSEGV) at 0x0000bed8 (code=1), thread 8495 (ashionassistant)
02-14 09:46:22.023: I/ActivityThread(8849): Pub com.btf271.ImageHelper.contentproviders.media: com.btf271.imagehelper.MediaContentProvider
导致错误的方法:MultitouchImagesView.loadImages(MultitouchImagesView.java:134):
/** Called by activity's onResume() method to load the images */
public void loadImages(Context context) {
Resources res = context.getResources();
int n = mImages.size();
for (int i = 0; i < n; i++){
try{
mImages.get(i).load(res);
}
catch(OutOfMemoryError oom){
Log.d("out of memory", "out of memory");
}
catch( Exception ex) {
Log.d("general exception", ex.getMessage());
}
}
}
NKN的答案解释了它崩溃的原因。那么有解决方案吗?
有关该应用的更多信息。用户一次向活动添加一个图像,以获得他们想要的尽可能多的图像。所以我将在第6张图片上限制它以避免outOfMemory异常。但是,我可以在每次向活动添加图像时检查outOfMemory异常,只是为了防止故障,以防一部手机无法处理6张图像吗? (有些手机可以处理30张图像,但有些可能只处理6张左右。)
答案 0 :(得分:0)
尽管有try/catch
阻止,它仍会崩溃,因为你已经没有内存了。你的一些图像正在消耗你剩下的所有内存,当发生这种情况时,虽然你试图处理它,但没有任何方法,因为你没有任何可用内存,所以你的应用程序就会死掉。
我会删除可绘制文件夹中的每个图像,然后逐个添加它们,以便您可以轻松检测出令人痛苦的图像并正确管理它。我建议阅读this。
答案 1 :(得分:0)
尝试通过定义全局异常处理程序
来从内存中转储应用程序的垃圾public class MyUncaughtExceptionHandler implements
Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (ex.getClass().equals(OutOfMemoryError.class)) {
try {
android.os.Debug.dumpHprofData("/sdcard/dump.hprof");
} catch (IOException e) {
Log.d("SD ExceptionHandler", ex.getMessage().toString());
}
} else {
Log.d("SD ExceptionHandler", ex.getMessage().toString());
}
}
}
然后在你的Activity的onCreate调用中:
Thread.currentThread().setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
答案 2 :(得分:0)
您需要在清单中将此标志设置为Application属性:
android:largeHeap="true"
因为您的目标是SDK 11或更高版本,所以它应该有用。
答案 3 :(得分:0)
Bitmaps会占用大量内存,特别是对于像这样的丰富图像 照片。例如,Galaxy Nexus上的相机拍照 高达2592x1936像素(5百万像素)。如果是位图配置 使用的是ARGB_8888(默认来自Android 2.3以后) 将此图像加载到内存大约需要19MB内存(2592 * 1936 * 4 字节),立即耗尽某些设备上的每应用限制。
http://developer.android.com/training/displaying-bitmaps/index.html
由于您未仔细处理图像,因此内存不足。请查看以下问题/答案,以便更好地了解尝试加载图片时会发生什么:Strange out of memory issue while loading an image to a Bitmap object
如果您是新开发人员,那么我建议您只使用任何为您加载部分的好库,否则加载图片会非常困难。
Android-Universal-Image-Loader:广泛使用的库https://github.com/nostra13/Android-Universal-Image-Loader
替代毕加索图书馆:一行代码为您完成工作:http://square.github.io/picasso/