小编Mik*_*ike的帖子

Android - onDestroy应该破坏活动,它的变量和释放内存

我的代码中有一个错误让我觉得我不完全了解Android生命周期.是的,我已阅读所有文档并查看了图表,但他们似乎只讨论何时保存数据,何时活动可能失去焦点或被杀死.但是,我的问题是,如果我不需要保存状态,变量及其存储值会发生什么变化?我希望它们被销毁,但我的代码中的错误似乎表明不是这样.

就我而言,这里发生了什么.我有一个启动自定义视图的活动(没有xml,我只是在自定义视图中在屏幕上绘制位图).我目前在我的活动中唯一的变量只是我的视图变量:GameView gameView;

现在在我看来,我声明了几个位图,简单的int和float变量来处理绘图和触摸事件,我有一个包含小位图的对象数组,每个对象的坐标和一些其他东西.我的类中对此对象的变量之一是一个静态变量,它表示它们的对象数量的当前计数.我是这样做的,所以对象的实例化使它跟踪人对象是如何对象的,而不是在对象的类之外跟踪它.

我希望静态变量在所有对象中保持相同的值,但我也希望在为Activity调用onDestroyed后,该变量与该Activity的视图的所有其他变量和对象一起被销毁.但是,这似乎不会发生.再次启动此活动时,此静态变量仍包含其上次运行时的先前值 - 即使调用了onDestroyed.

现在我的问题不是如何解决这个问题(我可以用不同的方式编写代码来修复这个bug),但是我想理解为什么这个静态变量发生了,因为它不是整个应用程序的全局,它只存在于内部那个活动的观点?此外,这让我想知道该视图中的其他变量 - 它们是否被破坏并且它们的内存被释放,或者至少它们的值在下次调用活动时不再可用,或者我自己需要这样做 - 即使我不需要保存任何这种状态数据?

感谢您对此的任何见解.

memory lifecycle android object-lifetime ondestroy

9
推荐指数
1
解决办法
4551
查看次数

无法创建应用程序的子类以与多个活动共享数据

我刚刚在我的游戏中完成了几项活动,现在我开始将它们连接起来使用真实的游戏数据,而不是我用来确保每件作品的测试数据.由于多个活动需要访问此游戏数据,因此我开始研究将此数据传递给我的活动的最佳方法.

我知道将putExtra与intent一起使用,但我的GameData类有相当多的数据而不仅仅是简单的键值对.除了相当多的基本数据类型外,它还有大型数组.我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对.

我读了下面这篇文章,并认为这是要走的路,但到目前为止,我还没有开始工作.

如何在Android中声明全局变量?

我创建了一个简单的测试应用程序来尝试这个方法,但它一直崩溃,我的代码看起来与上面的帖子看起来一样 - 除了我更改名称.这是我得到的错误.有人能帮助我理解我做错了什么吗?

12-23 00:50:49.762:ERROR/AndroidRuntime(608):引起:java.lang.ClassCastException:android.app.Application

它在以下声明中崩溃:

GameData newGameData = ((GameData)getApplicationContext());  
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

package mrk.examples.MainActivity;

import android.app.Application;

public class GameData extends Application {
    private int intTest;

    GameData () {
        intTest = 0;
    }

    public int getIntTest(){
        return intTest;
    }

    public void setIntTest(int value){
        intTest = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

//我的主要活动

package mrk.examples.MainActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    int intLocal;

    /** Called when the activity is first created. */
    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

android android-context android-activity

2
推荐指数
1
解决办法
8199
查看次数