2017-04-05 66 views
0

在我的应用程序中,有一些活动使用高分辨率PNG进行图形化处理。我有OutOfMemoryError错误,并通过将android:largeHeap="true"添加到我的清单文件来修复它。为什么ativity仍然使用称为finish()的RAM?

联想的Vibe P1(3GB RAM合计) enter image description here

在存储器监视器,第二activiy增加100+的RAM MB和不降低altought称为finish()函数它。以下是开始第三个活动的代码:

public void start_game(View v){ 
    header.setText("Loading..."); 
    Intent i = new Intent(this,game.class); 
    i.putExtra("episode",Integer.parseInt(v.getTag().toString())); 
    i.putExtra("online",false); 
    startActivity(i); 
    finish(); 
} 

如何从UI和RAM中完全删除活动?

+0

第一件事'android:largeHeap =“true”'只是一个绷带,并不是OOM的真正答案,因为它没有真正解决实际的OOM问题,这是代码的不好实现。第二个'finish()'不会立即释放该活动中的所有内容,线程可能仍然保存该活动引用并消耗内存。 :) – Enzokie

回答

0

在存储监视器中按'垃圾车'图标。
这会强制垃圾回收器运行并清理可以释放的内存。
系统将在需要时自行执行此操作,并在活动结束后的将来某个时间点执行此操作,但不一定在此之后。

如果运行gc不会释放内存,那么仍然存在对数据的引用。它可以在例如静态变量或单例对象中。你将不得不对代码进行更多的分析以找出可能的原因。

0

对于API级别11及以上版本,您可以尝试此操作来清除历史堆栈,并查看是否会使以前的活动释放RAM。

Intent i = new Intent(this,game.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

而对于API => 10,你可以使用IntentCompact(见本)类,像

IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 

因此可以支持预API级别11为好。

相关问题