2017-04-18 21 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(),但不能解決錯誤 –

相關問題