【发布时间】:2015-07-02 18:24:00
【问题描述】:
尝试在我的 android 应用程序中显示进度条和图像时出现错误:
07-02 12:33:55.008: E/AndroidRuntime(1565): FATAL EXCEPTION: main
07-02 12:33:55.008: E/AndroidRuntime(1565): Process: com.example.app, PID: 1565
07-02 12:33:55.008: E/AndroidRuntime(1565): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.Download}: android.view.InflateException: Binary XML file line #42: Error inflating class android.widget.ProgressBar
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread.access$800(ActivityThread.java:135)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.os.Handler.dispatchMessage(Handler.java:102)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.os.Looper.loop(Looper.java:136)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread.main(ActivityThread.java:5001)
07-02 12:33:55.008: E/AndroidRuntime(1565): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 12:33:55.008: E/AndroidRuntime(1565): at java.lang.reflect.Method.invoke(Method.java:515)
07-02 12:33:55.008: E/AndroidRuntime(1565): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-02 12:33:55.008: E/AndroidRuntime(1565): at dalvik.system.NativeStart.main(Native Method)
07-02 12:33:55.008: E/AndroidRuntime(1565): Caused by: android.view.InflateException: Binary XML file line #42: Error inflating class android.widget.ProgressBar
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.createView(LayoutInflater.java:620)
07-02 12:33:55.008: E/AndroidRuntime(1565): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
07-02 12:33:55.008: E/AndroidRuntime(1565): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.Activity.setContentView(Activity.java:1929)
07-02 12:33:55.008: E/AndroidRuntime(1565): at com.example.app.Download.onCreate(Download.java:78)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.Activity.performCreate(Activity.java:5231)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
07-02 12:33:55.008: E/AndroidRuntime(1565): ... 11 more
07-02 12:33:55.008: E/AndroidRuntime(1565): Caused by: java.lang.reflect.InvocationTargetException
07-02 12:33:55.008: E/AndroidRuntime(1565): at java.lang.reflect.Constructor.constructNative(Native Method)
07-02 12:33:55.008: E/AndroidRuntime(1565): at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.view.LayoutInflater.createView(LayoutInflater.java:594)
07-02 12:33:55.008: E/AndroidRuntime(1565): ... 25 more
07-02 12:33:55.008: E/AndroidRuntime(1565): Caused by: java.lang.OutOfMemoryError
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:594)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:429)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.content.res.Resources.loadDrawable(Resources.java:2110)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.content.res.Resources.getDrawable(Resources.java:700)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:282)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.content.res.Resources.loadDrawable(Resources.java:2092)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.widget.ProgressBar.<init>(ProgressBar.java:294)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.widget.ProgressBar.<init>(ProgressBar.java:246)
07-02 12:33:55.008: E/AndroidRuntime(1565): at android.widget.ProgressBar.<init>(ProgressBar.java:242)
07-02 12:33:55.008: E/AndroidRuntime(1565): ... 28 more
错误似乎在第 78 行崩溃:setContentView(R.layout.download);
但它也引用了我过去通过实现以下内容能够解决的内存不足问题:
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.ListView_layout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
但是在这种情况下,应用程序在这样做后仍然崩溃,我不确定为什么。
来源:
【问题讨论】:
-
从堆栈跟踪的外观来看,我怀疑您正在尝试为进度条加载可绘制的自定义位图,它绝对是巨大的。您能否报告您与进度条相关联的位图以及它有多大?
-
button_download = 508 x 121 imageView1 = 1,000px × 1,500px
-
假设每个像素的深度为 24 位,较大的图像在内存中将超过 4 MB。 Android 应用程序的可用最大堆大小因手机而异,介于 16MB 和 256MB 之间。在您尝试加载此布局之前,您似乎已接近应用程序的最大堆大小。您可以通过在清单中指定 android:largeHeap="true" 来临时修复它,但我强烈建议您预先缩放/优化图像可绘制对象的位深度,作为限制应用程序内存量的真正第一步消耗。
-
我该如何进行预缩放?图片是从 IMDB 上下来的——所以它们非常大......(我尝试添加 android:largeHeap="true" 作为快速创可贴修复 - 但它仍然崩溃[谢谢你的洞察力顺便说一句])
-
我会搜索从 URL 解码的调整大小位图。 SO上有很多项目解决了这个问题。
标签: android out-of-memory fatal-error forceclose