异常处理 - Android

时间:2014-02-13 20:51:06

标签: android exception-handling

我的应用有时会因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张左右。)

4 个答案:

答案 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或更高版本,所以它应该有用。

Android Heap memory increase

答案 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/