在活动类的静态字段保证活得比一个创建/销毁周期?(Are static fields in Acti

2019-09-01 22:20发布

我经常碰到,我有一个活动的几个调用之间保持状态的问题(即通过若干的onCreate()/ onDelete()循环去)。 不幸的是,Android的做这件事的支持是真穷。

作为一个简单的方法来保持状态,我想,既然类是由类加载器只装载一次,它可以安全地存储在一个静态捆绑场活动的多个实例之间共享的临时数据。

但是,有时,当实例的创建其中的静态包和存储数据,然后被摧毁,例如B试图从中读取,静电场突然NULL。

难道这不是意味着该类已被删除,而活动正在经历一个创建/销毁周期由类加载器重新加载? 否则怎么会一个静态字段一下子变得空当它被引用前一个对象?

Answer 1:

这个答案的第一部分是真的老了-见下面的做的正确方法

您可以使用Application对象存储应用持久对象。 这个Android的常见问题解答这个问题谈为好。

事情是这样的:

public class MyApplication extends Application{
    private String thing = null;

    public String getThing(){
        return thing;
    }

    public void setThing( String thing ){
        this.thing = thing;
    }
}

public class MyActivity extends Activity {
    private MyApplication app;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        app = ((MyApplication)getApplication());

        String thing = app.getThing();
    }
}

正确的做法

当第一次写这个答案,对于活动的生命周期的文档的情况不是很好,因为它是现在。 阅读节约活动状态上的活动文档部分帮助我们理解的Android希望我们如何保存状态。 从本质上讲,有你的活动开始在这两种情况:(1)作为新的活动,因为配置的变化(2),或者当它是由于内存压力被破坏后重建。 当你的活动开始,因为它是一个新的活动,然后saveInstanceState为空。 这不是否则空。 如果它是零,那么你的活动应该从头开始初始化。 片段非常相似的活动,我将详细介绍这个概念我AnDevCon-14幻灯片平台 。 您还可以看看示例代码为我的更多细节AnDevCon-14的介绍。

返工我前面的例子看起来像下面的代码。 我不改变语义的一点-在这第二个版本我想串thing是特定于一个特定的范围内活动的android任务 ,在上例中是不明确的。 如果你想保持周围相同的数据多机器人任务,然后使用任何应用程序对象或其他单依然是你最好的选择。

public class MyActivity extends Activity {
    private static final String THING = "THING";

    private String thing;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState==null) {
            // First time here (since we last backed out at least)
            thing = initializeThing(); // somehow we init it
        } else {
            // Rehydrate this new instance of the Activity
            thing = savedInstanceState.getString(THING);
        }

        String thing = app.getThing();
    }

    protected void onSaveInstanceState(Bundle outState) {
        outState.putString(THING, thing);
    }
}


Answer 2:

另外,亦正亦邪,方式保持静态数据是有你活动旋转了一个单例类。 此单将保持静态引用本身。

class EvilSingleton{
    private static EvilSingleton instance;

    //put your data as non static variables here

    public static EvilSingleton getInstance()
    {
        if(instance == null)
            instance = new EvilSingleton();
        return instance;
    }
}

在您的活动的onCreate()方法,您可以访问/建造单身,你可能需要的任何数据。 这样一来,你的活动或应用程序可以被摧毁或重新创建任意次数只要您进程的内存空间被保留你应该确定。

这是一个邪恶的黑客颠覆,所以没有承诺;-)



文章来源: Are static fields in Activity classes guaranteed to outlive a create/destroy cycle?