【问题标题】:Firebase is Calling onChildAdded twiceFirebase 两次调用 onChildAdded
【发布时间】:2017-03-10 23:01:52
【问题描述】:

我在 SearchTextView OnQueryListener 中调用OnChildAdded 方法,该方法使用OnChildAdded 方法在对话框中搜索和显示记录。但是当我运行代码时,OnChildAdded 方法似乎两次调用内部代码作为对话框提示两次,对于日志语句也是如此。

这是方法的代码:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
  mSearchQuery = query.trim();              
  mDatabaseReference.orderByChild("name").startAt(mSearchQuery).addChildEventListener(new ChildEventListener() {
    @Override
      public void onChildAdded(DataSnapshot dataSnapshot, String s) {

        student = dataSnapshot.getValue(Student.class);
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        EnrollOperationFragment enrollOperationFragment =  EnrollOperationFragment.newInstance(student.getName(),student.getId());
        enrollOperationFragment.show(fragmentManager,ENROLL_OPERATION);}

【问题讨论】:

    标签: android firebase firebase-realtime-database searchview


    【解决方案1】:

    onChildAdded 将为与您的查询匹配的每个子节点调用。但还要注意,每次用户提交搜索文本时,您都会添加一个新的子侦听器。因此,如果他们提交两次,则您有两个听众,您的 onChildAdded 将为每个孩子调用两次(每个听众一次)。然后当他们再次提交搜索时,它会添加第三个侦听器。以此类推。

    解决方案是在附加新侦听器之前分离先前的侦听器。请参阅documentation for detaching listeners。或者使用她的代码获得灵感:How stop Listening to firebase location in android

    【讨论】:

    • 尝试了您的解决方案@Frank van Puffelen 但没有运气,Firebase 侦听器只返回两次不超过此值,这是分离侦听器的代码: if (dataSnapshot !=null){ student = dataSnapshot. getValue(学生.class); Log.d("检查",student.getName()); mDatabaseReference.removeEventListener(this);} }
    • this 在最后一次通话中毫无意义。在我提供的第二个链接中,您可以看到如何保留对侦听器的引用,然后使用该引用取消注册。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多