android-studio - Android Studio 2.0 最简单的纯图片程序闪退 为什么?
ringa_lee
ringa_lee 2017-04-17 16:36:13
0
7
293

升级Android Studio 新建项目,默认Hello World 运行没有问题,删掉TextView,换成ImageView,只加载一个图,编译运行,程序闪退,下变为源码。

   

图片为1.19MB,2880*1800分辨率,放在drawable目录下,图片没有问题,在另一个同学的那里相同代码可以编译并顺利运行,相同代码和图片放在eclipse没有问题。
闪退后错误信息

04-10 22:46:38.733 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.733 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.733 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.media.session.MediaController', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.733 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.widget.Toolbar', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.ActivityManager$TaskDescription', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.assist.AssistContent', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:38.833 2393-2393/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 22:46:39.283 2393-2393/com.example.android.happybirthday E/dalvikvm-heap: Out of memory on a 46656012-byte allocation. 04-10 22:46:39.303 2393-2393/com.example.android.happybirthday E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.happybirthday, PID: 2393 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.happybirthday/com.example.android.happybirthday.MainActivity}: android.view.InflateException: Binary XML file line #12: Error inflating class android.widget.ImageView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.widget.ImageView at android.view.LayoutInflater.createView(LayoutInflater.java:621) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) at android.app.Activity.setContentView(Activity.java:1929) at com.example.android.happybirthday.MainActivity.onCreate(MainActivity.java:11) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.view.LayoutInflater.createView(LayoutInflater.java:595) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) at android.app.Activity.setContentView(Activity.java:1929) at com.example.android.happybirthday.MainActivity.onCreate(MainActivity.java:11) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) at android.content.res.Resources.loadDrawable(Resources.java:2115) at android.content.res.TypedArray.getDrawable(TypedArray.java:602) at android.widget.ImageView.(ImageView.java:129) at android.widget.ImageView.(ImageView.java:119) at java.lang.reflect.Constructor.constructNative(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at android.view.LayoutInflater.createView(LayoutInflater.java:595) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) at android.app.Activity.setContentView(Activity.java:1929) at com.example.android.happybirthday.MainActivity.onCreate(MainActivity.java:11) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)

换一张小图,1254*1254分辨率的就能够顺利运行,仅仅换了张图,将那张大图放在mipmap目录下,使用@mipmap就能运行。

想着是编译器出问题了,重装了整个AS,但还是不行,并且有时候错误信息是内存泄漏或者OOM

04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.media.session.MediaController', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.widget.Toolbar', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.ActivityManager$TaskDescription', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.app.assist.AssistContent', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:32.881 10358-10358/com.example.android.happybirthday E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method com.example.android.happybirthday.MainActivity.access$super 04-10 23:05:33.791 10358-10358/com.example.android.happybirthday E/dalvikvm-heap: Out of memory on a 118160652-byte allocation. 04-10 23:05:33.811 10358-10358/com.example.android.happybirthday E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.happybirthday, PID: 10358 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:422) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) at android.content.res.Resources.loadDrawable(Resources.java:2115) at android.content.res.TypedArray.getDrawable(TypedArray.java:602) at android.widget.ImageView.(ImageView.java:129) at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:57) at android.support.v7.widget.AppCompatImageView.(AppCompatImageView.java:53) at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:102) at android.support.v7.app.AppCompatDelegateImplV7.createView(AppCompatDelegateImplV7.java:972) at android.support.v7.app.AppCompatDelegateImplV7.onCreateView(AppCompatDelegateImplV7.java:1030) at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:44) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at android.view.LayoutInflater.inflate(LayoutInflater.java:397) at android.view.LayoutInflater.inflate(LayoutInflater.java:353) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) at com.example.android.happybirthday.MainActivity.onCreate(MainActivity.java:11) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)

请各路大神帮忙!感激不尽。

ringa_lee
ringa_lee

ringa_lee

reply all (7)
Peter_Zhu

撸主你这个问题我之前也遇到过,纠结了一天才解决。
如楼上所说,2880*1800的argb会占20m内存。但就算一张图20m内存,也不应该每次都出现oom,因为现在的机器几乎没有16m默认堆的情况了,比如我现在这个mxpro,前年的机器,默认256,largeheap是512。
如果情况特殊,可以在manifest文件中申请largeheap,但这不是本问题的所在。
问题出在drawable文件夹上,这个文件夹是对dpi敏感的。
如果你屏幕分辨率是1920*1080,那么,屏幕dpi是480,drawable文件夹下的图片,据我推测会当做120dpi的处理,也就是说,会将图片放大四倍,1w+的尺寸,爆内存是肯定的了。

上图是一个project的res文件夹,对于drawable也可以有相应的dpi级别,你这张图,最好的选择是放在xxxhdpi下,这样如果在低dpi机器上时会自动缩放,还是你这个1920*1080,480dpi的机器上,实际图片大小会缩放为480/640,也就是四分之三,很大程度上优化了内存使用。
最不济,你得放在nodpi文件夹下,这样起码它不会自动放大。
最后上个Google官方的dpi对应数据
A set of six generalized densities:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi


http://developer.android.com/intl/zh-cn/...
Google对于这方面的官方指导,顺便补充下,我上面对于默认dpi的猜测是错误的,默认是160dpi。

    迷茫

    我想你应该恶补一下图片在内存中存储的方式,简单的说吧,不是编译的问题,是内存爆了所以崩溃了。
    给你计算你一下你这张图片所占用的内存:
    2880 * 1800 = 5148000 (px)
    5148000 * 4Byte = 20736000 (Byte) = 19.78 (MB)
    一张图片占用近20MB的内存空间,而Android标配给一个App的内存空间只有16MB,能不爆吗?

      左手右手慢动作

      我看错了 不是2.0问题

        阿神

        你看看你的activity里有没有下面这个函数,有的话删了。

        @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); }
          巴扎黑

          不是吧,就是内存溢出了吧。之所以其他可以和手机有关吧,低内存自然就爆了,和AS无关,我这边也今天升级的,跑原来的应用没有问题

            迷茫

            楼上正解,图片大小要控制啊。一个像素可是4个字节的哦

              左手右手慢动作

              不是 AS 的问题,是图片太大,内存溢出的问题,就行楼上几位所说的。

              关于显示大图片,可以参考官方的文档:Loading Large Bitmaps Efficiently

                Latest Downloads
                More>
                Web Effects
                Website Source Code
                Website Materials
                Front End Template
                About us Disclaimer Sitemap
                php.cn:Public welfare online PHP training,Help PHP learners grow quickly!