【问题标题】:how to wait until a fragment is removed如何等到片段被删除
【发布时间】:2019-08-08 21:46:05
【问题描述】:

我有一个包含动态片段的活动。我需要在 删除片段后运行一些代码,但 remove(myFragment).commit() 是异步执行的,我不知道片段何时被删除。这是我的代码:

final FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(myFragment).commit();
//wait until the fragment is removed and then execute rest of my code

来自文档:

public abstract int commit()

安排此事务的提交。提交不会发生 立即地;它将被安排在主线程上工作 下次该线程准备好时完成。

【问题讨论】:

    标签: android android-fragments fragmenttransaction


    【解决方案1】:

    如果你使用片段的 onDetach 方法来调用 Activity 并告诉它完成了呢?

    class MyFrag extends Fragment {
    
        private Activity act;
    
        @Override
        public void onAttach(Activity activity) {
            act = activity;
        }
    
        @Override
        public void onDetatch() {
            act.fragGone();
        }
    }
    

    在活动中:

    public void fragGone() {
        //do something, update a boolean, refresh view, etc.
    }
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用片段的onDetached() 回调。每当它从其 Activity 中删除时,都会调用它。

      【讨论】:

        【解决方案3】:

        使用 onAttach() 来检查 Fragment 何时附加到 Activity,并使用 onDettach() 来检查 Fragment 何时被分离到 Activity。

        使用 onDettach() 你还可以通过这种方式检查是否更新视图、数据等:

        @Override
        public void onDetach() {
            super.onDetach();
            synchronized (mLock) {
                mReady = false;
            }
        }
        

        【讨论】:

        • synchronized(mLock) 在你的代码中是干什么用的?如果可能,请添加更多代码。谢谢
        • 与刷新或不是asyncktask有关。例如,如果片段已分离,但后台任务在此状态下完成,它会尝试更新视图,例如 textView.setText(newStringValue)。在这种情况下,如果 mReady 为假,请避免这种行为。
        • 你不需要同步,因为 onDetach 和 onPostExecute 是在同一个线程上调用的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        相关资源
        最近更新 更多