Android:Firebase 结果在不同的条形码扫描中连续显示两次

Android: Firebase results are showing twice in a row in different barcode scans

所以我的程序正在使用条形码扫描项目并从 firebase 获取(成功地)它的名称,然后我试图在警告对话框中打印名称。我的问题是,每次我扫描一个项目时,AlertDialog 都会显示预览扫描的项目。例如我扫描 item1。在我要扫描的下一个产品中,它将再次打印 item1 的 name.But 在下一个扫描中,它将打印 item2 的名称等等。 总体问题是在连续两次不同的扫描中打印一个产品的相同名称。怎么了?

在此代码中,我 return DataSnapshot 值作为方法的结果

public interface MyCallback {
        void onCallback(String value);
    }
    public void readData(final MyCallback myCallback) {
        final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference("Items").child(myResult);
        mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                name = dataSnapshot.child("itemname").getValue().toString();
                myCallback.onCallback(name);


            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                Toast.makeText(addquantityactivity.this,"there was an error",Toast.LENGTH_SHORT).show();
            }
        });
    }

这是警报对话框生成器

public void handleResult(Result result) {
         myResult = result.getText();

       AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Scan Result");

        readData(new MyCallback() {
            @Override
            public void onCallback(String value) {
                //here i get the item's name from firebase 
                finalname=value;
            }
        });
      //and here im printing it to the builder
        builder.setMessage(finalname);
        AlertDialog alert1 = builder.create();
        alert1.show();


    }

值得一提的是,我在同一个 class 中还有另一个 firebase 方法,它更新数据库中的一些数据。如果这可以提供有关该问题的更多信息..

您在进程完成之前显示了一个对话框。你可以试试这个:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Scan Result");

readData(new MyCallback() {
    @Override
    public void onCallback(String value) {
         finalname=value;
         builder.setMessage(finalname);
         AlertDialog alert1 = builder.create();
         alert1.show();
    }
});

你应该在完成后显示