【问题标题】:Can I determine if a reference to an Activity is valid?我可以确定对 Activity 的引用是否有效?
【发布时间】:2012-08-06 19:35:40
【问题描述】:

如果Activity已被销毁,但AsyncTask仍具有对该对象的引用,有没有办法直接查询引用(已销毁)的活动以确定Activity是否仍然存在有效的?

【问题讨论】:

    标签: android android-asynctask android-activity


    【解决方案1】:

    在Activity的onDestroy()方法中,设置一个标志,表示Activity被销毁了。

    此外,在AsyncTask 中添加WeakReferenceActivity,而不是普通引用。

    AsyncTaskonPostExecute() 方法中,如果WeakReference 仍然有值,并且Activity 本身的标志仍然设置为false,则Activity 仍然存在。

    【讨论】:

    • 我在 Android API 中没有看到任何保证,即当 Activity 有效时,对 Activity 的弱引用将保证保持不变,而当 Activity 有效时,弱引用保证将被取消。被摧毁。你有具体的理由不相信吗?
    • 如果活动被释放,弱引用很快就会被清空。这样的事情应该只在活动被破坏之后发生,因为这是活动生命周期的最后一步。当然,如果仍然有对该活动的引用,那么将使用我所写的标志,因为弱引用仍将指向该活动。你可以在这里阅读弱参考:developer.android.com/reference/java/lang/ref/… 和关于活动生命周期的信息:developer.android.com/reference/android/app/Activity.html
    • “将很快被取消”.. 还不够好。这并不能很好地表明活动的状态
    【解决方案2】:

    尝试将WeakReference 保留在您的活动中。

    WeakReference<Activity> ref = new WeakReference<Activity>(activity);
    … … …
    Activity activity = ref.get();
    if (activity != null) {
        // DO SOMETHING
    }
    

    【讨论】:

    • 我在 Android API 中没有看到任何保证,即当 Activity 有效时,对 Activity 的弱引用将保证保持不变,而当 Activity 有效时,弱引用保证将被取消。被摧毁。你有具体的理由不相信吗?
    • 为避免重复,请参阅 android 开发者complete answer
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多