【问题标题】:Changing activity in android clears the memory needed for the previous activities?在android中更改活动会清除以前活动所需的内存?
【发布时间】:2013-06-19 23:42:34
【问题描述】:

我正在开发一个多关卡游戏,其中每个关卡都是一项新活动。

我想知道,如果我改变像这样的活动

Intent myIntent = new Intent(getBaseContext(), Level3.class);
                startActivity(myIntent);

Level 1 和 2 使用的内存被清空了?

如果没有,我怎样才能清除上一级活动中的所有内容,以便手机仅将内存用于当前活动?

【问题讨论】:

  • 你应该在活动之前完成以清除内存。使用 this.finish()

标签: android memory


【解决方案1】:

您需要致电finish() 处理您不想再进行的活动。您可以在开始新活动后立即调用它:

Intent myIntent = new Intent(getBaseContext(), Level3.class);
startActivity(myIntent);
finish();

否则,前一个活动将保留在活动堆栈中。

【讨论】:

    【解决方案2】:

    由于您使用的是活动/关卡设计,只需在 onPause 方法中添加一个检查您的活动是否完成,并将您对当前关卡的所有引用清空,这样 GC 就会知道您的关卡对象应该被释放,并且会尽快发布。

    @Override
    public void onPause(){
          super.onPause();
          if (isFinishing()){
             levelObject = null;
    }
    

    }

    【讨论】:

    • 或者您可以使用onDestroy
    • onPause get 是第一个被调用的,所以它会更快的释放内存。这就是重点。
    【解决方案3】:

    我不建议您为每个游戏关卡创建 Activity。最好在 one Activity 中创建一些控制器来初始化您的游戏关卡。当然,它必须有一些方法来清除上一阶段的内存,如下所示:

        class StageManager
    {
        public Stage curStage;
    
        public initStage(Stage stage)
        {
            //init stage here
            curStage = stage;
            stage.init();
        }
    
        public clearStage()
        {
            //do some clearing staff
            curStage .clear();
        }
    }
    
        abstract class Stage
    {
        public abstract init();
        public abstract clear();
    }
    
        abstract class FirstStage extends Stage
    {
        //....
    } 
    
        abstract class SecondStage extends Stage
    {
        //....
    } 
    

    在活动中:

    StageManager stageManager = new StageManager();
    
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_view);
    
        stageManager.init(new FirstStage());
    }
    
    @Override
    public void onClick(View theView)
    {
        int id = theView.getId();
    
        if (id == R.id.btnNextLevel) {
            stageManager.clear();
            stageManager.init(new SecondStage());
        }
    }
    

    您可以使用片段代替您的自定义管理器:

    在这两种方式 - 片段或您自己的管理器中,您会将不同的阶段逻辑分离到不同的类。

    您无需创建另一个 Activity 来分隔您的 1000 多行代码。只需使用 Stage 或 Stratagy 设计模式之一。

    如果您仍想使用活动,只需执行以下操作:

    Intent myIntent = new Intent(getBaseContext(), Level3.class);
    startActivity(myIntent);
    finish();
    

    在 onDestroy() 中:

        @Override
    protected void onDestroy()
    {
        //here you must clear all data that were used in this Stage (Activity) like this :
    
        clearMemmory();
        super.onDestroy();
    }
    
    private void clearMemmory()
    {
        if(stageData!=null)
        {
            stageData.clear();
            stageData =null;
        }
    }
    

    或在打开另一个舞台之前直接清除内存,例如:

    clearMemmory();
    
    Intent myIntent = new Intent(getBaseContext(), Level3.class);
    startActivity(myIntent);
    
    finish();
    

    最好的祝愿。

    【讨论】:

    • 每个级别都是一个非常不同的游戏。所以很难在 1 个活动中拥有 1000+ 行。这就是我喜欢使用更多的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2023-03-08
    相关资源
    最近更新 更多