Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在网络回调后正确弹出片段?_Android_Callback_Android Architecture Navigation_Android Fragment Manager - Fatal编程技术网

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

Android 如何在网络回调后正确弹出片段?,android,callback,android-architecture-navigation,android-fragment-manager,Android,Callback,Android Architecture Navigation,Android Fragment Manager,我有一个片段a,点击按钮打开片段B。 片段B的职责是进行网络调用,同时显示用于加载的UI动画(一个简单的加载程序Lottie动画)。一旦网络调用完成,片段B将从后堆栈中弹出 现在,每当网络调用花费的时间超过正常时间(例如10秒),并且当用户返回应用程序时,如果用户锁定屏幕或离开应用程序(换句话说,调用Activity的onStop()),则会崩溃,并出现堆栈下的跟踪 我有一个很好的解决方案,即我可以使用handler.postdayed()延迟弹出调用,但我意识到这不是一个优雅的解决方案,这里显

我有一个片段a,点击按钮打开片段B。 片段B的职责是进行网络调用,同时显示用于加载的UI动画(一个简单的加载程序Lottie动画)。一旦网络调用完成,片段B将从后堆栈中弹出

现在,每当网络调用花费的时间超过正常时间(例如10秒),并且当用户返回应用程序时,如果用户锁定屏幕或离开应用程序(换句话说,调用Activity的onStop()),则会崩溃,并出现堆栈下的跟踪

我有一个很好的解决方案,即我可以使用handler.postdayed()延迟弹出调用,但我意识到这不是一个优雅的解决方案,这里显然有一些地方做错了。 这里的任何帮助都是感激的

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, fragment, 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);
        }
    }
public void popFragments(int-popDepth,@Nullable FragNavTransactionOptions transactionOptions)引发不支持的操作异常{
if(isRootFragment()){
抛出新的UnsupportedOperationException(
无法对根片段进行popFragment。如果需要更改此片段,请使用replaceFragment(fragment)”;
}否则如果(popDepth<1){
抛出新的UnsupportedOperationException(“popFragments参数需要大于0”);
}else if(mSelectedTabIndex==无选项卡){
抛出新的UnsupportedOperationException(“未选择选项卡时无法弹出片段”);
}
//如果我们的popDepth足够大,可以清除堆栈,那么调用它。
if(popDepth>=MFFragmentStacks.get(mSelectedTabIndex.size()-1){
clearStack(交易选项);
返回;
}
片段;
FragmentTransaction ft=createTransactionWithOptions(transactionOptions);
//弹出堆栈上的片段数,并将其从FragmentManager中删除
for(int i=0;i