从Firebase RealtimeDatabase(Android、Java)收集数据时出现问题

从Firebase RealtimeDatabase(Android、Java)收集数据时出现问题,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,从Firebase上的节点收集数据时出现问题。我得到了一个名为stockBuy的变量,我已经在调试模式下运行了我的应用程序,它正确地获取了值,但是在onDataChange()中,我的变量变成了1,而不是firebase+1中的值,就像我在这一行中看到的那样stockBuy=stockBuy+1 在这里你可以看到我的代码 private void deleteProduct(final int position){ mDataBase3 = FirebaseDatabase.getIns

从Firebase上的节点收集数据时出现问题。我得到了一个名为
stockBuy
的变量,我已经在调试模式下运行了我的应用程序,它正确地获取了值,但是在
onDataChange()
中,我的变量变成了1,而不是firebase+1中的值,就像我在这一行中看到的那样
stockBuy=stockBuy+1

在这里你可以看到我的代码

private void deleteProduct(final int position){
    mDataBase3 = FirebaseDatabase.getInstance().getReference().child("Products");
    mDataBase4 = FirebaseDatabase.getInstance().getReference().child("Wishes");
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Products").child(MainActivity.carrito.get(position).getId());

    ref.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            stockBuy = Integer.parseInt(dataSnapshot.child("stock").getValue().toString());          
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
    });

    stockBuy = stockBuy + 1;

    mDataBase3.child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
    mDataBase4.child(userUid).child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);

    MainActivity.carrito.remove(position);

    this.cAdapter.notifyDataSetChanged();

}

数据是从Firebase异步加载的,这意味着
onDataChange
的执行可能比您预期的要晚得多。如果您放置断点或添加一些日志记录,您可以看到
stockBuy=stockBuy+1
在调用
stockBuy=Integer.parseInt
之前运行,这就解释了问题

任何需要数据库数据的代码都需要在
onDataChange
中,或者从那里调用。因此,最简单的解决方法是:

private void deleteProduct(final int position){
    mDataBase3 = FirebaseDatabase.getInstance().getReference().child("Products");
    mDataBase4 = FirebaseDatabase.getInstance().getReference().child("Wishes");
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Products").child(MainActivity.carrito.get(position).getId());

    ref.addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            stockBuy = Integer.parseInt(dataSnapshot.child("stock").getValue().toString());          

            stockBuy = stockBuy + 1;

            mDataBase3.child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
            mDataBase4.child(userUid).child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);

            MainActivity.carrito.remove(position);

            this.cAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            throw error.toException();
        }
    });
}
另见: