2017-04-18 31 views
0

我正在开发一款使用Firebase的应用。在我的一项活动中,我添加了删除功能。但是,当我删除节点并监视Firebase控制台中的行为时。如何修复基于android的Firebase错误,同时删除导致无限循环的对象?

首先删除对象,再加2。然后删除2,再加3-4。这种操作持续到设备变得不稳定(陷入无限循环)的程度。该应用程序会导致屏幕全黑。什么都没有Logcat显示“太多的输出要处理”。导航按钮将用户带回不稳定的应用程序。

它不会卸载。唯一的解决办法是强制重新启动它。用于执行此操作的代码是

mChatsListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
      chatToDelete = ((TextView) view.findViewById(R.id.sender_roll_text_view)).getText().toString().trim(); 
      final AlertDialog.Builder builder = new AlertDialog.Builder(ChatsActivity.this); 
      builder.setMessage("Delete Chat?").setPositiveButton("Delete", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        Query query = mDatabaseReference.orderByChild("roll").equalTo(chatToDelete); 
        query.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
           dataSnapshot1.getRef().removeValue(); 
           chats.remove(position); 
           mChatsAdapter.notifyDataSetChanged(); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) {} 
        }); 
       } 
      }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
      builder.show(); 
      return true; 
     } 
    }); 

此代码昨天工作正常。但现在这是一个巨大的问题。所以,如果你弄明白,请帮忙。谢谢。

+0

不知道有关火力地堡太大变化,我会大胆地猜测,要么在'removeValue()'或' notifyDataSetChanged()'产生一个新的'onDataChange()'事件。也许使用['AtomicBoolean'](https://developer.android.com/reference/java/util/concurrent/atomic/AtomicBoolean.html)来检测重新进入? –

回答

0

我认为这是因为您使用addValueEventListener而不是addListenerForSingleValueEvent。通过使用addValueEventListener,每次更改数据库时都会触发onDataChange

onClick请从

query.addValueEventListenerquery.addListenerForSingleValueEvent

这应该解决您的问题

+0

我一直只使用addListenerForSingleValueEvent。 –

+0

但根据你的代码,它是'addValueEventListener'而不是'addListenerForSingleValueEven'请仔细看看。 –

+0

对不起。我想我给了代码的以前版本。在新版本中,我使用addListenerForSingleValueEvent(),但不能解决错误 –