gpt4 book ai didi

当内存不足时,Android 不会从堆栈中杀死 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:58:59 25 4
gpt4 key购买 nike

我们一直在开发一个应用程序,它有一个下拉仪表板,允许用户在整个应用程序中导航。导航不是很标准,因为几乎每个 Activity 都可以访问此菜单。使用菜单打开 Activity 玩了一会儿后,堆栈开始越来越大。

所有这些 Activity 都包含 ListView ,其中包含多个 ImageView ,每个约占 3 MB。如果用户玩得足够多并在堆栈上创建了超过 25 个 Activity ,则会发生这种情况:

  1. 抛出内存不足错误(堆增加直到没有更多堆)。
  2. 由于异常显示了一个对话框(不幸的是,%activity% 已停止。)
  3. 引发 outofmemerror 的 Activity 已完成。
  4. 堆栈中的所有 Activity 都已完成,但保留了历史记录,因此可以备份并且每个 Activity 都由操作系统自动重新创建。

我期望系统在抛出 OutOfMemoryError 之前自动终止堆栈中最旧的 Activity ...

为了确保操作系统不会终止旧 Activity ,我创建了一个每次分配 1mb 的测试应用程序。猜猜看:行为是一样的,但会抛出 outofmemerror:

问题是:我们如何告诉 Android 操作系统允许它在需要时取消分配 Activity 及其资源,这样我们就不会收到“很遗憾,您的 Activity 已停止”。对话?

概念验证

    package 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];
}
}

最佳答案

I was expecting the system to kill the oldest activities in the stack automatically BEFRORE the OutOfMemoryError was thrown

Android 不会这样做。 Android 终止进程以为其他进程释放系统内存。它不会以类似的方式涉及应用程序内的内存使用。

How can we tell the Android OS that it is allowed to deallocate activities and its resources if needed so we don't get the "Unfortunately, your activity has stopped." dialog?

你不能。

相反,您需要将应用程序设计为使用更少的 Activity ,或者每个 Activity 使用更少的资源。例如,您可以通过 FLAG_ACTIVITY_REORDER_TO_FRONT“回收”现有 Activity 实例,或者(正如 Tornquist 先生所指出的),您可以自己手动finish() Activity 。

After playing for a while opening activities using the menu, the stack starts to grow and grow.

您可能应该在这些菜单项上使用 FLAG_ACTIVITY_REORDER_TO_FRONT,这样您就可以在任务中推进现有 Activity ,而不是每次都创建新 Activity 。

关于当内存不足时,Android 不会从堆栈中杀死 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11616575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com