Firebase Firestore绑定RecyclerView遇FAILED BINDER TRANSACTION错误求助
解决Firestore RecyclerView绑定的FAILED BINDER TRANSACTION和StackOverflowError问题
看起来你遇到的问题是几个小细节失误叠加导致的:上下文使用不当、Firestore适配器生命周期未正确管理,再加上布局绘制时的循环触发。我们一步步来修复:
1. 替换LayoutManager的上下文
在Fragment中用getApplicationContext()初始化LinearLayoutManager是不合适的,应用上下文没有关联当前Activity的视图层级,容易引发视图绘制的异常循环。换成requireContext()(推荐,确保Fragment已附加到Activity)或者getContext()即可:
recyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
2. 正确管理FirestoreRecyclerAdapter的生命周期
FirestoreRecyclerAdapter需要手动启动/停止数据监听,否则会导致数据持续加载、内存泄漏,甚至引发超大Parcel传递(也就是你看到的parcel size = 19834640)。在Fragment中添加以下生命周期方法:
@Override public void onStart() { super.onStart(); if (adapter != null) { adapter.startListening(); } } @Override public void onStop() { super.onStop(); if (adapter != null) { adapter.stopListening(); } }
注意:要把adapter变量提升为Fragment的成员变量,这样生命周期方法才能访问到它:
// 在FriendsFragment类顶部声明成员变量 private FirestoreRecyclerAdapter<FriendModel, FriendHolder> adapter;
3. 排查布局文件single_friend_row_test.xml
报错日志里的StackOverflowError是在Drawable重绘循环中触发的(RippleDrawable反复调用invalidate),大概率是布局控件的样式/背景设置有问题:
- 检查TextView的背景是否用了会无限触发重绘的drawable(比如配置错误的自定义RippleDrawable)
- 简化布局层级,避免不必要的嵌套,减少绘制压力
- 可以先替换成极简布局测试:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <TextView android:id="@+id/id_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp"/> </LinearLayout>
修改后的完整FriendsFragment代码
public class FriendsFragment extends Fragment{ private static final String TAG = "FriendsFragment"; private FirestoreRecyclerAdapter<FriendModel, FriendHolder> adapter; // 成员变量 FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); CollectionReference friends = FirebaseFirestore.getInstance().collection("Users").document(user.getUid()).collection("friends"); RecyclerView recyclerView; public FriendsFragment() { } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 注意这里要传第三个参数false,避免重复添加父布局 View view = inflater.inflate(R.layout.fragment_friends, container, false); Log.d(TAG, "onCreateView: "+ friends); final Query query = friends.limit(2); recyclerView = view.findViewById(R.id.id_recycleViewFriends); recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); FirestoreRecyclerOptions<FriendModel> options = new FirestoreRecyclerOptions.Builder<FriendModel>() .setQuery(query,FriendModel.class) .setLifecycleOwner(this) .build(); adapter = new FirestoreRecyclerAdapter<FriendModel, FriendHolder>(options) { @Override protected void onBindViewHolder(FriendHolder holder, int position, FriendModel model) { holder.setName(model.getName()); } @Override public FriendHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new FriendHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.single_friend_row_test, parent, false)); } }; recyclerView.setAdapter(adapter); return view; } @Override public void onStart() { super.onStart(); if (adapter != null) { adapter.startListening(); } } @Override public void onStop() { super.onStop(); if (adapter != null) { adapter.stopListening(); } } }
这些修改应该能解决你遇到的绑定错误和栈溢出问题,核心是修复上下文适配、管理适配器生命周期,以及排除布局绘制的循环异常。
内容的提问来源于stack exchange,提问作者ashaneen
相关产品推荐
相关产品推荐

