如何删除因内存不足错误导致的膨胀异常

时间:2017-07-28 11:20:17

标签: java android

我在Kids ABCD应用程序中遇到了太多崩溃,而且由于内存错误而导致的Inflate Exceptions也是如此。

当应用程序在前台运行时会占用太多空间,导致它崩溃。

只有当我们在不同的活动之间切换得如此之快以至于堆区域被如此快速地填充并且应用程序开始提供膨胀异常并最终在活动销毁时释放空间之前崩溃时,才会出现此问题。 (完成活动之间的快速切换以检查应用程序性能)。

主要原因可能是大型图像或应用程序在缓存后台存储中占用更多空间。

大尺寸图像不是问题,因为我们已经确认所有图像都应该是中等大小。我们对代码所做的另一件事是我们通过调用finish()方法完成了每个intent的每个活动。这里使用finish()方法,以便活动可以从当前空间释放所有位图(关闭活动时)。

super.onCreate(savedInstanceState);
    setContentView(R.layout.ringa_ringa);   

    pause = (ImageView) findViewById(R.id.pause);
    txt = (TextView) findViewById(R.id.txt);
    pause.setVisibility(View.VISIBLE);
    txt.setTextColor(Color.parseColor("#ffffff"));
    list = new ArrayList<>();
    mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "Kids_Rhymes");

    ringa_thread_running = false;



    pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (counter == 0) {
                mediaPlayer.stop();
                ringa_thread_running = false;
                position = 0;
                if (lyrics_ring.isAlive()) {
                    lyrics_ring.interrupt();
                }
                pause.setImageResource(R.drawable.play);
                counter = 1;
            } else if (counter == 1) {
                pause.setImageResource(R.drawable.pause);
                counter = 0;
                onResume();
            }
        }
    });

    String[] words = getResources().getString(R.string.ringa).split("\\$");
    for (String w : words) {
        System.out.println("=======String====" + w);
        list.add(w);

    }

试图找到准确的解决方案,但没有得到合适的解决方案。

2 个答案:

答案 0 :(得分:0)

将以下代码放在您的清单

 android:largeHeap="true"

 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

答案 1 :(得分:0)

  

如何删除由于内存不足错误导致的膨胀异常

总体上使用更少的内存,特别是避免重复的大量分配。您可以使用Android Studio来帮助解决此问题,例如通过生成堆转储来查看内存中各个点的对象。

  

大尺寸图像不是问题,因为我们已经确认所有图像都应该是中等大小

请记住&#34;中等大小&#34;需要根据使用的堆空间来衡量,这比使用的磁盘空间大得多,因为大多数图像都以压缩形式存储。另外,请记住,可绘制资源会根据设备的屏幕密度和您在资源目录中为资源声明的屏幕密度进行缩放。

  

这里使用了finish()方法,以便活动可以从当前空间释放所有位图(关闭活动时)。

首先,您的活动被销毁的时间与下一个活动开始的时间并不完全同步。这里的互动比这更复杂。

其次,对于您可能再次使用的位图,释放它们并稍后尝试重新分配它们是获得OutOfMemoryErrors的一种好方法。

总体而言,有书籍和课程涵盖Android内存管理。您可以考虑从这些资源中学习。