活动生命周期重叠

时间:2018-01-10 16:31:04

标签: android android-activity

我有三个活动A,B,C。从网络获取数据时,所有A显示都是一个微调器。根据数据,下一个活动可能是B或C.B和C都有一个后退按钮,调用super.onBackPressed()返回A.此时,网络缓存可能导致A立即 < / em>回到B或C.

B和C都使用带有create和destroy方法的单例类。我在B / C的onCreate中调用singleton的create方法,并在B / C的onDestroy中调用singleton的destroy方法。

问题是重叠:如果活动B(1)正在运行且用户点击后退按钮,他将返回A,这可能会立即开始新的活动B(2)。但是,B(1)onDestroy方法可以在 B(2)onCreate方法之后调用,这意味着最后调用单例的destroy方法,导致B(2)中的异常:

B2 - onCreate (singleton's create method called)
B1 - onDestroy (singleton's destroy method called)
B2 - crashes when trying to use singleton

有没有办法确保在创建B2之前销毁B1?我可以在A中放一个小的最小延迟,但这不能保证。我还读到我可以让B的发射模式“singleTop”首先防止它被破坏,但我不确定这是否合适,因为它是B之后的一系列其他活动。

1 个答案:

答案 0 :(得分:1)

在这种情况下使用singleton不是一个好习惯,您可能只想在应用程序生命周期中将应用程序类中的单例实例化一次。 如果你确实需要一个遵循活动生命周期的单例,那么你可以将一个实例映射绑定到活动的上下文中,并使用延迟的inizialization。

public class SingleTon {
    static HashMap<Context, SingleTon> instances;

    static SingleTon getInstance(Context c) {
        if (instances.get(c) == null) {
            SingleTon newInstance = new SingleTon();
            instances.put(c, newInstance);
        }
        return instances.get(c);
    }

    static void destroy(Context c) {
        instances.remove(c);
    }
}