我们一直在开发一个应用程序,它有一个下拉仪表板,允许用户在整个应用程序中导航。导航不是很标准,因为几乎每个活动都可以访问此菜单。在使用菜单打开活动一段时间后,堆栈开始增长。
所有这些活动都包含列表视图,里面有几个图像视图,每个大约需要 3mb。如果用户玩得足够多并在堆栈上创建超过 25 个活动,则会发生以下情况:
- 抛出内存不足错误(堆增加直到没有更多的堆)。
- 由于异常而显示一个对话框(不幸的是,%activity% 已停止。)
- 抛出 outofmemerror 的活动已完成。
- 堆栈中的所有活动都已完成,但保留了历史记录,因此可以备份,并且每个活动都由操作系统自动重新创建。
我期待系统在抛出 OutOfMemoryError 之前自动杀死堆栈中最旧的活动......
为了确保操作系统不会杀死旧的活动,我创建了一个每次分配 1mb 的测试应用程序。你猜怎么着:行为是一样的,并且抛出了 outofmemerror:
问题是:如果需要,我们如何告诉 Android 操作系统允许释放活动及其资源,这样我们就不会得到“不幸的是,您的活动已停止”。对话?
概念证明
包 com.gaspar.memorytest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MemoryTestActivity extends Activity {
/** Called when the activity is first created. */
private byte[] mData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(MemoryTestActivity.this, MemoryTestActivity.class);
startActivity(i);
}
});
mData = new byte[1*1024*1024];
}
}