我的应用正在使用我的物理设备(MotoG3)和模拟器(Nexus 5),并在Google Play开发者控制台上的预启动崩溃测试中对13个设备中的11个进行测试。它失败的两个设备是Galaxy Note 2和3(Android 4.4),如下图所示 -
我不确定出了什么问题,是否存在任何内存泄漏,如果是这样,如何捕获?这对我来说都是新的。
outOfMemoryError为 -
FATAL EXCEPTION: main
Process: com.tdp.tdp, PID: 17269
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:677)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:507)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:872)
at android.content.res.Resources.loadDrawable(Resources.java:3054)
at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
at android.widget.ImageView.<init>(ImageView.java:133)
at android.support.v7.widget.au.<init>(Unknown Source)
at android.support.v7.widget.au.<init>(Unknown Source)
at android.support.v7.a.bh.a(Unknown Source)
at android.support.v7.a.as.c(Unknown Source)
at android.support.v7.a.as.a(Unknown Source)
at android.support.v4.view.ak.onCreateView(Unknown Source)
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:173)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:690)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at com.thedailypiece.thedailypiece.c.a(Unknown Source)
at android.support.v4.app.n.b(Unknown Source)
at android.support.v4.app.z.a(Unknown Source)
at android.support.v4.app.z.a(Unknown Source)
at android.support.v4.app.e.run(Unknown Source)
at android.support.v4.app.z.e(Unknown Source)
at android.support.v4.app.z.b(Unknown Source)
at android.support.v4.app.ah.b(Unknown Source)
at android.support.v4.view.ViewPager.a(Unknown Source)
at android.support.v4.view.ViewPager.a(Unknown Source)
at android.support.v4.view.ViewPager.a(Unknown Source)
at android.support.v4.view.ViewPager.setCurrentItem(Unknown Source)
at com.github.paolorotolo.appintro.AppIntroViewPager.setCurrentItem(Unknown Source)
at com.github.paolorotolo.appintro.b.onClick(Unknown Source)
at android.view.View.performClick(View.java:4630)
at android.view.View$PerformClick.run(View.java:19339)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5335)
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:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
Galaxy Notes具有非标准dpi配置。它们可能正在加载非常大的位图(或者扩展你提供的位图)。 (Why does my Galaxy Note 3 have the same DP dimensions as a much smaller phone?)
你有几个解决方案,
提供所有dpi级别的图像资源,以便系统不必缩放丢失的分辨率。
使用图像库(如Glide或Picasso)以最佳分辨率加载图像。
最重要的是,确保将文件剪切为正确的尺寸。如果无法在屏幕上显示超大位图,则无用。
答案 1 :(得分:1)
这在每个Android应用程序中都很常见。你有一些Image会在你的AppIntroViewPager
碎片中占用大量内存,因此你需要对其进行缩减采样,以便不会占用所有应用程序的内存。
你应该阅读这个Displaying Bitmaps in Your UI并考虑使用像Picasso,Glide这样的图像加载库。