如何在网络回调正确后弹出片段?

如何解决如何在网络回调正确后弹出片段?

我有一个片段A,在按钮上单击可打开片段B。 片段B的职责是进行网络调用,并同时显示要加载的UI动画(一个简单的加载器Lottie Animation)。一旦完成网络调用,就会从后堆栈中弹出片段B。

现在,只要网络调用花费的时间比平时多(例如10秒),并且当用户返回到以下位置时,如果用户锁定了屏幕或离开了应用程序(换句话说,调用了Activity的onStop()),应用程序崩溃并显示以下堆栈跟踪。

我对此有一个很棘手的解决方案,即我可以使用handler.postDelayed()延迟弹出呼叫,但我意识到这不是一个优雅的解决方案,并且在这里肯定存在某些错误。 感谢您的任何帮助。

Fatal Exception: java.lang.IllegalStateException: FragmentManager is already executing transactions
       at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1776)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1841)
       at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java:489)
       at com.custom.org.core.base.FragNavController.executePendingTransactions(FragNavController.java:657)
       at com.custom.org.core.base.FragNavController.popFragments(FragNavController.java:291)
       at com.custom.org.core.base.FragNavController.popFragment(FragNavController.java:227)
       at com.custom.org.core.base.FragNavController.popFragment(FragNavController.java:234)
       at com.custom.org.passive.stepsDonation.ConvertingStepstocharityFragment.exitConvertingtocharityFragment(ConvertingStepstocharityFragment.kt:232)
       at com.custom.org.passive.stepsDonation.ConvertingStepstocharityFragment.access$exitConvertingtocharityFragment(ConvertingStepstocharityFragment.kt:33)
       at com.custom.org.passive.stepsDonation.ConvertingStepstocharityFragment$observeFailureMsgLiveData$1.onChanged(ConvertingStepstocharityFragment.kt:193)
       at com.custom.org.passive.stepsDonation.ConvertingStepstocharityFragment$observeFailureMsgLiveData$1.onChanged(ConvertingStepstocharityFragment.kt:33)
       at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)
       at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:144)
       at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:443)
       at androidx.lifecycle.LiveData$LifecycleBoundobserver.onStateChanged(LiveData.java:395)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
       at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
       at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
       at androidx.lifecycle.LifecycleRegistry.movetoState(LifecycleRegistry.java:145)
       at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
       at androidx.fragment.app.FragmentViewLifecycleOwner.handleLifecycleEvent(FragmentViewLifecycleOwner.java:51)
       at androidx.fragment.app.Fragment.performStart(Fragment.java:2737)
       at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:355)
       at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1192)
       at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1354)
       at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
       at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1495)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
       at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2575)
       at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:258)
       at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:550)
       at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
       at com.sharesmile.share.core.MainActivity.onStart(MainActivity.java:330)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1256)
       at android.app.Activity.performStart(Activity.java:6994)
       at android.app.Activity.performRestart(Activity.java:7131)
       at android.app.ActivityThread.handleWindowVisibility(ActivityThread.java:4434)
       at android.app.ActivityThread.-wrap33(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1698)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6816)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1565)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1453)

这是我弹出片段的方式:

public void popFragments(int popDepth,@Nullable FragNavTransactionoptions transactionoptions) throws UnsupportedOperationException {
        if (isRootFragment()) {
            throw new UnsupportedOperationException(
                    "You can not popFragment the rootFragment. If you need to change this fragment,use replaceFragment(fragment)");
        } else if (popDepth < 1) {
            throw new UnsupportedOperationException("popFragments parameter needs to be greater than 0");
        } else if (mSelectedTabIndex == NO_TAB) {
            throw new UnsupportedOperationException("You can not pop fragments when no tab is selected");
        }

        //If our popDepth is big enough that it would just clear the stack,then call that.
        if (popDepth >= mFragmentStacks.get(mSelectedTabIndex).size() - 1) {
            clearStack(transactionoptions);
            return;
        }

        Fragment fragment;
        FragmentTransaction ft = createTransactionWithOptions(transactionoptions);

        //Pop the number of the fragments on the stack and remove them from the FragmentManager
        for (int i = 0; i < popDepth; i++) {
            fragment = mFragmentManager.findFragmentByTag(mFragmentStacks.get(mSelectedTabIndex).pop().getTag());
            if (fragment != null) {
                ft.remove(fragment);
            }
        }

        //Attempt to reattach prevIoUs fragment
        fragment = reattachPrevIoUsFragment(ft);

        boolean bShouldPush = false;
        //If we can't reattach,either pull from the stack,or create a new root fragment
        if (fragment != null) {
            ft.commitAllowingStateLoss();
        } else {
            if (!mFragmentStacks.get(mSelectedTabIndex).isEmpty()) {
                fragment = mFragmentStacks.get(mSelectedTabIndex).peek();
                ft.add(mContainerId,fragment,fragment.getTag());
                ft.commitAllowingStateLoss();
            } else {
                fragment = getRootFragment(mSelectedTabIndex);
                ft.add(mContainerId,generateTag(fragment));
                ft.commitAllowingStateLoss();

                bShouldPush = true;
            }
        }

        executePendingTransactions();

        //Need to have this down here so that that tag has been
        // committed to the fragment before we add to the stack
        if (bShouldPush) {
            mFragmentStacks.get(mSelectedTabIndex).push(fragment);
        }

        mCurrentFrag = fragment;
        if (mTransactionListener != null) {
            mTransactionListener.onFragmentTransaction(mCurrentFrag,TransactionType.POP);
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?