从未触发setValue()操作的完成侦听器?

时间:2017-04-04 22:53:11

标签: java firebase firebase-realtime-database

我正在使用Firebase处理Java(不是Android)的图形程序,我正在尝试查看某个字符串的一个数据库的值,当我找到它时,从第一个数据库中获取数据并将其写入另一个数据库。

我能够正确读取和写入数据,但由于两个特定的问题,我遇到了让程序终止的问题。

  1. 如果我不以某种方式“等待”完成侦听器(在本例中为CountDownLatch),程序会在完成侦听器的onComplete()方法触发之前终止,并且值为从未写入数据库。

  2. 如果我使用CountDownLatch等待onComplete()方法触发,程序永远不会终止,因为显然完成侦听器永远不会触发。

  3. 当我使用CountDownLatch时,会写入数据,但完成侦听器永远不会触发,程序也不会终止。

    以下是我这样做的方法:

    public static void addUser() {
        final String email = Tools.getEmail();
        DatabaseReference grayRef = FirebaseDatabase.getInstance().getReference().child("graylist");
    
        // Search the graylist for the email specified.
        CountDownLatch dataChange = new CountDownLatch(1); // need this so Parse-Ly doesn't close before event fires
        grayRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onCancelled(DatabaseError dbe) {}
    
            @Override
            public void onDataChange(DataSnapshot snap) {
                Iterable<DataSnapshot> graylist = snap.getChildren();
                for(DataSnapshot gray : graylist) {
                    String uid = gray.getKey();
                    String em = gray.getValue(String.class);
                    if(em.equals(email)) {
                        // We found the one we're looking for. Insert its UID into the whitelist.
                        final CountDownLatch completion = new CountDownLatch(1);
                        DatabaseReference whiteRef = FirebaseDatabase.getInstance().getReference().child("whitelist");
                        whiteRef.child(uid).setValue(email, new DatabaseReference.CompletionListener() {
                            @Override
                            public void onComplete(DatabaseError dbe, DatabaseReference dbr) {
                                completion.countDown();
                                if(dbe != null) {
                                    System.err.println("Error adding user to whitelist!");
                                    dbe.toException().printStackTrace();
                                }
                            }
                        });
                        try {
                            completion.await();
                            System.out.println("User added successfully!");
                        } catch(InterruptedException ie) {
                            System.err.println("ERROR: Completion latch interrupted!");
                            ie.printStackTrace();
                        }
                        break;
                    }
                }
                dataChange.countDown();
            }
        });
    
        try {
            dataChange.await(); // wait for event to fire before we move on
        } catch(InterruptedException ie) {
            System.err.println("ERROR: Data change latch interrupted!");
            ie.printStackTrace();
        }
    }
    

    “完成”CountDownLatch是我用来等待触发onComplete()方法的那个。

    有没有人知道为什么尽管数据被写入并出现在数据库中,完成侦听器永远不会触发?

0 个答案:

没有答案