我有一个有3个acitivtys的Android应用程序:
A1 - 开始 - > A2 - 开始 - > A3 - 完成他的流程后:启动 - > A1
(所以我没有“完成();”一个应用程序。我用“startActivity(..);”用户交互后的整个时间开始下一个活动)
所以这3个活动都有一个循环。 在每个活动中,我显示位于SD卡上的3-9张图片,我使用以下功能加载:
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;
}
这一切都有效。 但有时候(通过我的活动循环几次后),我的应用程序崩溃了..
Logcat告诉我:
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)
有人可以提供一些如何处理崩溃的提示吗? 也许是因为我的活动设置为“暂停”而不是正确关闭它们?
答案 0 :(得分:32)
快速修复,您可以添加
清单应用程序标记中的 android:largeHeap="true"
我在我的桌子上遇到了OOM问题inlele和nook
Heap size (large)
android:largeHeap="true"
提到规范使用更大的堆link here:
编辑:使用缓存位图技术link here
答案 1 :(得分:2)
我在显示高分辨率图像时遇到了类似的问题。我搜索并应用了http://developer.android.com/training/displaying-bitmaps/index.html中给出的所有android位图解决方案,并在链接中缓存了mekanism。但它们都不起作用。没有任何正确的解决方案。然后我发现问题是:我无法使用drawable文件夹结构。我在mdpi和hdpi文件夹中保存高分辨率图像。这导致android将图像缩小到超大尺寸。由于android监视器/内存部分,100 kb图像导致内存增加20 mb。 所以我已将这些超分辨率图像添加到xxhdpi文件夹中,然后它突然被修复了。然后我的图像滑块完美无缺地工作
答案 2 :(得分:0)
是的,当android对用户不可见时,android不会立即销毁活动,但是根据当前状态调用了许多生命周期方法。查看http://developer.android.com/guide/components/activities.html#Lifecycle
您可以尝试完成onStop()或onDestroy()中的活动,因为当活动不可见以及系统内存不足时,将会调用这些活动。 : - )
答案 3 :(得分:0)
这是由于您必须使用以下代码缩放位图的高分辨率图像
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
int h = 100; // height in pixels
int w = 100; // width in pixels
Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true);
ivTmp.setImageBitmap(photoBitMap);