WeakReference to Activity(Android)

时间:2010-09-10 18:28:51

标签: android memory-leaks android-activity weak-references

在我的Android应用中,当用户尝试从一个活动转换到另一个活动时,可能会有一些全局状态表明他们需要先完成其他一些操作。

为了实现这一点,我编写了一个包含以下代码的类:

private static WeakReference<Activity> oldActivityReference;
private static Intent waitingIntent;

public static void pushActivity(Activity currentActivity, Intent newActivityIntent) {
    Intent blockingIntent = ThisClass.getBlockingActivity();
    if (blockingIntent != null) {
        ThisClass.oldActivityReference = new WeakReference<Activity>(currentActivity);
        ThisClass.waitingIntent = newActivityIntent;
        currentActivity.startActivity(blockingIntent);
        return;
    }
    currentActivity.startActivity(newActivityIntent);
}

当阻塞活动完成时,它会调用ThisClass.blockingActivityFinished()。这将检查对旧活动的弱引用是否仍然存在,如果是,则从该活动启动原始意图。如果没有,它将从我的应用程序的上下文中启动原始意图。

我的问题是,
这听起来有道理吗?这种技术是否存在潜在的内存泄漏问题?有没有更好的方法来实现这一目标?

编辑 - 需要明确的是,可能触发中断的事件类型包括:1)服务器ping指示当前应用程序版本已弃用2)任何服务器RPC指示用户的凭据不再有效。我想要为每个Activity添加逻辑来处理这些事务的检查,并在完成后像往常一样恢复业务。这违反了DRY,在团队环境中容易出错。

1 个答案:

答案 0 :(得分:4)

  

这听起来是否合理?

我从不使用这种技术。可变静态数据成员是危险的,WeakReference尽管如此。特别是,如果用户做了不可想象的事情,并且比如说将手机用作手机,或者让应用程序流出很长一段时间,我希望这会失败。您的活动可能会被销毁并终止您的流程以释放RAM,但活动将保留在任务中并可能会重新激活。那时候,你的状态很糟糕,因为静力学已经被破坏了。

  

此技术是否存在潜在的内存泄漏问题?

您正在泄漏Intent

  

有没有更好的方法来实现这一目标?

出于本答案其余部分的目的,我将把您的起点称为活动A,将“其他一些操作”称为活动B,将期望的结尾称为活动C.因此,在您的代码中,newActivityIntent适用于活动C,blockingIntent适用于活动B,currentActivity适用于活动A.

选项#1:将决策过程放在活动C中,而不是活动A.让活动C检查onCreate()中的条件,如果条件需要活动,立即调用活动B的startActivity() B将被展示。

选项#2:将决策过程保留在活动A中,但是在true额外的Intent传递布尔值(例如,startActivity()为“我们必须显示活动B”)调用活动C.活动C检查onCreate()中的布尔值,如果布尔值这样,则立即调用活动B的startActivity()

在这些选项中,您可以避免静态。