gpt4 book ai didi

android - Firebase Firestore addSnapshotListener() 可能导致 "FragmentManager is already executing transactions"错误

转载 作者:行者123 更新时间:2023-11-29 16:30:59 27 4
gpt4 key购买 nike

我最近接手了一个项目,该项目是我前一段时间正在处理的更新依赖项,与此事件有关,我更新了 firestore 的依赖项 (com.google.firebase:firebase-firestore) 17.1.5 到最新的 18.2.0。由于这次更新,现在我的应用程序突然抛出以下错误:

java.lang.IllegalStateException: FragmentManager is already executing transactions

在 fragment 的 onActivityCreated 方法中调用 addSnapshotListener() 时。 (因为错误是关于 FragmentManager,我认为这可能是相关的)

具体代码如下:

docRef.collection(COLLECTION_PATH).addSnapshotListener(Objects.requireNonNull(getActivity()), (queryDocumentSnapshots, e) -> {
//other stuff to do after detecting collection change
});

当我将依赖项恢复为旧依赖项时,错误消失了。我猜 Firestore 中有某种行为变化破坏了我的代码,但我仍然不确定它到底是什么以及如何修复它。

这是详细的错误堆栈跟踪:

java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManagerImpl.java:1657)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1717)
at androidx.fragment.app.FragmentManagerImpl.executePendingTransactions(FragmentManagerImpl.java:228)
at com.google.firebase.firestore.util.ListenerRegistrationImpl.lambda$onFragmentActivityStopCallOnce$1(com.google.firebase:firebase-firestore@@18.2.0:190)
at com.google.firebase.firestore.util.ListenerRegistrationImpl$$Lambda$2.run(Unknown Source:4)
at android.app.Activity.runOnUiThread(Activity.java:6282)
at com.google.firebase.firestore.util.ListenerRegistrationImpl.onFragmentActivityStopCallOnce(com.google.firebase:firebase-firestore@@18.2.0:174)
at com.google.firebase.firestore.util.ListenerRegistrationImpl.<init>(com.google.firebase:firebase-firestore@@18.2.0:209)
at com.google.firebase.firestore.Query.addSnapshotListenerInternal(com.google.firebase:firebase-firestore@@18.2.0:917)
at com.google.firebase.firestore.Query.addSnapshotListener(com.google.firebase:firebase-firestore@@18.2.0:882)
at com.google.firebase.firestore.Query.addSnapshotListener(com.google.firebase:firebase-firestore@@18.2.0:823)
... [My app's call to addSnapshotListener] ...
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2565)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:907)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1235)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1301)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:710)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2071)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1861)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1816)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1693)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:560)
at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:148)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:743)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:815)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)

更新:刚更新到19.0.0,错误依旧。

最佳答案

在您的 addSnapshotListener 中删除 getActivity()。在 onPause() 上使用 listener.remove 处理监听器分离。

    Query query = db.collection("cities");
ListenerRegistration registration = query.addSnapshotListener(
new EventListener<QuerySnapshot>() {
// ...
});

// ...

// Stop listening to changes
registration.remove();

关于android - Firebase Firestore addSnapshotListener() 可能导致 "FragmentManager is already executing transactions"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608927/

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