2016-05-11 10 views
0

我有一个最简单的应用程序。其中没有繁重的节目正在进行。我有两个活动,我会从一个活动到另一个活动,例如 我将从Activity1进入Activity2,然后从Activity2回到Activity1。应用程序正在从一个活动到另一个活动时来回OOM多次

通过多次这样做,我得到OOM错误和当时的应用程序崩溃 我不知道为什么它只发生在Activity1中的背景图像和按钮,Activity2中只有Backgorund图像,并且一个图像视图和一个按钮

在回去我使用onDestroy方法销毁Activity2并在Activity1中使用此方法,但它仍然无法使内存变空。

这里是一个完整的堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.efu.myprojet, PID: 4241 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.efu.myprojet/com.efu.myprojet.MainActivity}: android.view.InflateException: Binary XML file line #1: Error inflating class at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2702) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) at android.app.ActivityThread.access$900(ActivityThread.java:177) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5951) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class at android.view.LayoutInflater.createView(LayoutInflater.java:640) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748) at android.view.LayoutInflater.inflate(LayoutInflater.java:483) at android.view.LayoutInflater.inflate(LayoutInflater.java:415) at android.view.LayoutInflater.inflate(LayoutInflater.java:366) at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) at com.efu.myprojet.MainActivity.onCreate(MainActivity.java:69) at android.app.Activity.performCreate(Activity.java:6289) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)  at android.app.ActivityThread.access$900(ActivityThread.java:177)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:145)  at android.app.ActivityThread.main(ActivityThread.java:5951)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)  Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:288) at android.view.LayoutInflater.createView(LayoutInflater.java:614) at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)  at android.view.LayoutInflater.inflate(LayoutInflater.java:483)  at android.view.LayoutInflater.inflate(LayoutInflater.java:415)  at android.view.LayoutInflater.inflate(LayoutInflater.java:366)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)  at com.efu.myprojet.MainActivity.onCreate(MainActivity.java:69)  at android.app.Activity.performCreate(Activity.java:6289)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)  at android.app.ActivityThread.access$900(ActivityThread.java:177)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:145)  at android.app.ActivityThread.main(ActivityThread.java:5951)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)  Caused by: java.lang.OutOfMemoryError: Failed to allocate a 9216012 byte allocation with 2044572 free bytes and 1996KB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:747) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:568) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1014) at android.content.res.Resources.loadDrawableForCookie(Resources.java:3747) at android.content.res.Resources.loadDrawable(Resources.java:3620) at android.content.res.TypedArray.getDrawable(TypedArray.java:762) at android.view.View.(View.java:3957) at android.view.ViewGroup.(ViewGroup.java:507) at android.widget.RelativeLayout.(RelativeLayout.java:249) at android.widget.RelativeLayout.(RelativeLayout.java:245) at android.widget.RelativeLayout.(RelativeLayout.java:241) at java.lang.reflect.Constructor.newInstance(Native Method)  at java.lang.reflect.Constructor.newInstance(Constructor.java:288)  at android.view.LayoutInflater.createView(LayoutInflater.java:614)  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689)  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)  at android.view.LayoutInflater.inflate(LayoutInflater.java:483)  at android.view.LayoutInflater.inflate(LayoutInflater.java:415)  at android.view.LayoutInflater.inflate(LayoutInflater.java:366)  at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)  at com.efu.myprojet.MainActivity.onCreate(MainActivity.java:69)  at android.app.Activity.performCreate(Activity.java:6289)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2655)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767)  at android.app.ActivityThread.access$900(ActivityThread.java:177)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1449)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:145)  at android.app.ActivityThread.main(ActivityThread.java:5951)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372) 

更新1:

添加我个XML 的Xml第一个活动的

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.efu.myproject.FirstActivity" 
    android:background="@drawable/bg_enter_the_book"> 


    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_alignParentBottom="true" 
     android:id="@+id/lLayout" 
     android:padding="10dp"> 
     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_alignParentBottom="true" 
      android:background="@drawable/btn_next" 
      android:onClick="EnterTheJungleBookButton" 
      android:text="   " 
      android:visibility="invisible" 
      android:layout_marginBottom="20dp"/> 
    </LinearLayout> 
</RelativeLayout> 

活性2命名MainActivity

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/background" 
    tools:context="com.efu.myproject.MainActivity"> 

     <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:src="@drawable/bg_anim_name" 
      android:id="@+id/iv_anim_name"/> 

     <TextView 
      android:id="@+id/tv_anim_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:layout_centerHorizontal="true" 
      android:keepScreenOn="true" 
      android:text="@string/dummy_content" 
      android:textColor="#ffffff" 
      android:textSize="@dimen/tv_anim_name" 
      android:textStyle="bold" 
      android:layout_above="@+id/tv_empty"/> 
     <TextView 
      android:id="@+id/tv_empty" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:layout_centerHorizontal="true" 
      android:keepScreenOn="true" 
      android:text="sdasdasd" 
      android:visibility="invisible" 
      android:textColor="#33b5e5" 
      android:textSize="@dimen/tv_empty" 
      android:layout_alignBaseline="@+id/iv_anim_name" 
      android:layout_alignBottom="@+id/iv_anim_name" 
      android:textStyle="bold" 
      /> 
    </RelativeLayout> 

    <ImageView 
     android:id="@+id/iv_anim_pic" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:maxHeight="@dimen/iv_anim_pic_height" 
     android:src="@drawable/ic_launcher" /> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_gravity="bottom|center_horizontal" 
     android:fitsSystemWindows="true"> 

     <RelativeLayout 
      android:id="@+id/fullscreen_content_controls" 
      style="?metaButtonBarStyle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom|center_horizontal" 

      android:orientation="horizontal" 
      tools:ignore="UselessParent"> 

      <Button 
       android:id="@+id/btn_next" 
       style="?metaButtonBarButtonStyle" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:background="@drawable/btn_next" 
       android:layout_alignParentTop="true" 
       android:layout_centerHorizontal="true" /> 

     </RelativeLayout> 
    </FrameLayout> 

</RelativeLayout> 

Also I have a Static class which contains the resources of my app and I am retreieving those resources from that static class for example

ivAnimPicture.setImageResource(NextResource.getPicture(anyRandomNum)); 

这里是我其中包含资源

public class NextResource { 

    static int[] animPics = {R.drawable.anteater,R.drawable.antelope,R.drawable.bear, 
      R.drawable.bird,R.drawable.cat,R.drawable.chicken,R.drawable.cow,R.drawable.dog, 
      R.drawable.duck,R.drawable.elephant,R.drawable.fox, 
      R.drawable.frog,R.drawable.impala,R.drawable.lion,R.drawable.monkey,R.drawable.ostrich, 
      R.drawable.panda,R.drawable.penguin,R.drawable.rabbit, 
      R.drawable.sheep,R.drawable.tiger,R.drawable.vulture,R.drawable.zebra}; 

    static String[] animName = {"Anteater","Antelope","Bear","Parrot","Cat","Chicken","Cow","Dog", 
      "Duck","Elephant","Fox","Frog","Impala","Lion","Monkey","Ostrich", 
      "Panda","Penguin","Rabbit","Sheep","Tiger","Vulture","Zebra"}; 
// public static int [] animSound = {R.raw.ballon,R.raw.billi,R.raw.carrot, 
//   R.raw.fountain,R.raw.horse,R.raw.huka,R.raw.sparrow,R.raw.tea}; 

    public static int [] animSound = {R.raw.anteater,R.raw.antelope,R.raw.bear, 
      R.raw.parrot,R.raw.cat,R.raw.chicken,R.raw.cow,R.raw.dog, 
      R.raw.duck,R.raw.elephant,R.raw.fox, 
      R.raw.frog,R.raw.impala,R.raw.lion,R.raw.monkey,R.raw.ostrich, 
      R.raw.panda,R.raw.penguin,R.raw.fox, 
      R.raw.sheep,R.raw.tiger,R.raw.vulture,R.raw.zebra}; 

    public static int getPicture(int i){ 

     return animPics[i]; 
    } 
    public static int getSound(int i){ 

     return animSound[i]; 
    } 

    public static String getName(int i){ 

     return animName[i]; 
    } 


} 

**所以我务必做好这门课吗?我在哪里犯错误? **

As I am using NextResource Static class to fetch my resources , is it the real reason to gain the memory again and again and not freeing the memory allocation ?

EDIT2

@Override 
protected void onDestroy() { 

    if (tts != null) { 
     tts.stop();//tts is Text To Speech whcih I am using 
     tts.shutdown(); 
    } 
    ivAnimPicture = null; //this is the Imageview to show random pics 
    secureRandom = null; 
    mAccelerometer = null; 
    mSensorManager = null; 
    mShakeDetector = null; 
    tvAnimName = null; 
    btnNext = null; 
    random = null; 
    mediaPlayer = null; 
    map = null; 

    super.onDestroy(); 

} 
+0

你可以添加你的布局xmls(活动1和活动2)吗? – Droidekas

+0

是更新我的问题 –

+0

你的意思是“我使用onDestroy方法销毁Activity2”?发布您的'onDestroy'方法代码。 – Budius

回答

-1

比例缩小的背景图片的大小。可能是你正在使用太大的图像。请参阅thisthis

+0

我工作的设备是S4 xxhdpi,所以我有相应的图像 即1200 * 1920 ,,, –

+0

我说的是图像大小而不是宽度和高度。如果你想检查,那么请删除你的图像,并检查你的应用程序是否你得到OOM? –

+0

你的意思是我应该压缩我的图像? –

0

根据上面发布的日志,由于布局中的错误膨胀而发生此错误。请检查您的布局一次或张贴您的代码更清晰。 或者您的活动中是否有任何后台任务需要加载任何图像?

0

您描述的是内存泄漏的经典场景。

于是从头开始,如果你不知道内存泄漏是我用Google搜索它,这里的链接是我能找到的第一个结果页面上最漂亮的插图:http://www.programcreek.com/2013/10/the-introduction-of-memory-leak-what-why-and-how/

遗憾的是内存泄漏可以在任何地方发生,即使您将完整的项目分享给我们,大多数人都不会理会它,因为发现内存泄漏实在太无聊了。

说,是方法和工具来帮助你:

  • 内存监控。首先是事情。您应该使用Android Studio上的内存监视器来检查它是否实际上是内存泄漏。当内存增长到新的活动时,你会看到它发生,而从内存回来时它不会减少。

  • LeakCanary来救援。在广场上的家伙做了这个真棒库来自动检测内存泄漏https://github.com/square/leakcanary它并没有完成所有的工作,但是当你指出Activity时,它应该是非常简单的。只要按照他们自述的内容。

这应该让你开始。快乐的编码。

编辑:

onDestroy代码,我可以看到你使用加速度计,传感器管理器,震动探测器和媒体播放器。这些都是可以参考活动并泄漏它的东西。只是打电话null并不意味着,对方并没有举行你的活动。

所以,只是重新强调我的原始答案:了解内存泄漏,检查内存监视器和使用泄漏金丝雀。

+0

,我如何解除他们?我的意思是如果我将它们设置为null,那么为什么内存没有清理?或者我应该做什么 –

+0

看看这些类的方法,如:removeListener或setListener(null)或某种类型的stop或clean up。当你创建它们并将setLister作为你的活动时,它们可以非常容易地挂在框架级别上,并仍然可以参照你的活动。但所有这些都是预示,你应该使用LeakCanary来获取详细的数据。 – Budius

+0

我没有得到它如何使用它,你可以请指导我如何使用LeakCanary –

相关问题