gpt4 book ai didi

android - 在 onBackStackChanged() 中调用时,SDK 25.1.0 在 CommitNow 上崩溃。谷歌错误?

转载 作者:太空狗 更新时间:2023-10-29 13:10:48 25 4
gpt4 key购买 nike

我有一个 Activity ,包含 2 个 fragment FragmentMainOneFragmentMainTwo,只要 onBackStackChanged() 被调用

public class MainActivity extends AppCompatActivity {

private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);

loadFragment();

getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
loadFragment();
}
}
});
}

public void loadSubFragment() {
getSupportFragmentManager().beginTransaction().replace(R.id.view_container,
new FragmentSubOne(), FragmentSubOne.TAG).addToBackStack(FragmentSubOne.TAG).commit();
}

public void loadFragment() {
count++;
if (count % 2 == 1) {
getSupportFragmentManager().beginTransaction().replace(R.id.view_container,
new FragmentMainOne(), FragmentMainOne.TAG).commitNow();
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.view_container,
new FragmentMainTwo(), FragmentMainTwo.TAG).commitNow();
}
}
}

代码在升级到 SDK 25.1.0 之前运行良好。 (即在 25.0.0 及更早版本中没问题)。

升级到 SDK 25.1.0 后,在 onBackStackChanged() 时,它会在 commitNow() 上崩溃

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.elyeproj.commitissue, PID: 3876
java.lang.IllegalStateException: FragmentManager is already executing transactions
at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1946)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965)
at android.support.v4.app.BackStackRecord.commitNow(BackStackRecord.java:614)
at com.elyeproj.commitissue.MainActivity.loadFragment(MainActivity.java:45)
at com.elyeproj.commitissue.MainActivity$1.onBackStackChanged(MainActivity.java:27)
at android.support.v4.app.FragmentManagerImpl.reportBackStackChanged(FragmentManager.java:2409)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2157)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:822)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:775)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:178)

如果我将 commitNow() 切换为 commit(),它也能正常工作。这是最新 SDK 的错误,还是我遗漏了什么?

请注意可以访问完整代码以复制问题 https://github.com/elye/issue_commitnow_sdk25_1_0(只需加载应用程序,单击“GO TO SUBFRAGMENT”,然后单击“返回”...崩溃发生。)

最佳答案

经过调查,这似乎是支持库 25.1.0 中引入的新约束。

崩溃发生在

private void ensureExecReady(boolean allowStateLoss) {
if (mExecutingActions) {
throw new IllegalStateException("FragmentManager is already executing transactions");
}
// ... more codes
}

所以某些东西已将 mExecutingActions 设置为 true。

发现在25.1.0的FragmentManager类中,下面的代码是新增的

private boolean popBackStackImmediate(String name, int id, int flags) {
execPendingActions();
ensureExecReady(true);

boolean executePop = popBackStackState(mTmpRecords, mTmpIsPop, name, id, flags);
if (executePop) {
mExecutingActions = true;
try {
optimizeAndExecuteOps(mTmpRecords, mTmpIsPop);
} finally {
cleanupExec(); // setting mExecutingAction = false
}
}

doPendingDeferredStart();
return executePop;
}

在弹出 fragment 堆栈时将 mExecutingActions 设置为 true。 25.1.0 之前没有设置。我认为这是明确引入预防措施,以确保在提交另一个 fragment 之前完成后台堆栈弹出。

要解决此问题,只需使用 commit() if commitNow()

有关此问题的更多说明,请参阅 https://medium.com/@elye.project/new-in-support-library-25-1-0-android-disallow-commitnow-on-onbackstackchanged-227c651eefb2#.p9ds8m8ws

关于android - 在 onBackStackChanged() 中调用时,SDK 25.1.0 在 CommitNow 上崩溃。谷歌错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41280564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com