필자는 Firebase 데이터베이스의 "graylist"항목을 살펴보고 사용자 입력에 대해 확인하기 위해 정적 프로그램을 작성했습니다. 엔트리가 존재합니다. 필자는 항목을 잘 찾을 수 있지만, Firebase와의 데이터 읽기/쓰기 작업의 제약으로 인해 작업이 성공했는지 사용자에게 알리는 방법을 찾지 못했습니다. 아니.Firebase 검색 성공시 사용자에게 알리기
나는 다음과 같은 방법이 있습니다
public static void addUser() {
final boolean [] complete = new boolean[1];
final String email = Tools.getEmail();
DatabaseReference grayRef = FirebaseDatabase.getInstance().getReference().child("graylist");
// Search the graylist for the email specified.
CountDownLatch latch = 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.
DatabaseReference whiteRef = FirebaseDatabase.getInstance().getReference().child("whitelist");
whiteRef.child(uid).setValue(email, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError dbe, DatabaseReference dbr) {
complete[0] = true;
latch.countDown();
if(dbe != null) {
System.err.println("Error adding user to whitelist!");
dbe.toException().printStackTrace();
}
}
});
break;
}
}
if(latch.getCount() > 0) {
complete[0] = false;
latch.countDown();
}
}
});
try {
latch.await(); // wait for event to fire before we move on
} catch(InterruptedException ie) {
System.err.println("ERROR: Add user latch interrupted!");
ie.printStackTrace();
}
if(complete[0]) ParselyMain.createAlert(AlertType.CONFIRMATION, "User Added", "User added to the whitelist!");
else ParselyMain.createAlert(AlertType.INFORMATION, "User Not Found", "That user was not found in the graylist!");
}
내가 최종 부울 배열이 얼마나 해키 실현을하지만, 심지어 나를 위해 작동하지 않습니다. 아이디어는 CountDownLatch를 사용하고 쓰기가 성공적 일 때만 카운트 다운합니다. graylist의 모든 항목을 읽고 CountDownLatch가 여전히 1이면 아무 것도 기록되지 않고 스레드를 종료하기 위해 카운트 다운해야하지만 부울은 작업이 성공했는지 여부를 결정합니다.
문제는 onComplete 메서드가 호출되기 전에 for 루프 이후에 if 블록에 도달하여 작업이 실패했다고 생각하고 (Firebase의 데이터베이스가 다르게 표시하더라도) 잘못된 경고가 출력되는 것 같습니다. .
사용자가 허용 목록에 추가되었거나 사용자를 찾을 수없는 경우 적절히 알릴 수 있도록 더 나은 방법을 생각해 볼 수 있습니까?
onComplete가 별도의 스레드에 있고 JavaFX가 기본 스레드 외부에서 대화 메시지를 작성할 수 없기 때문에 불가능합니다. 다소 실망 스럽습니다. –
이 게시물은 도움이 되나요? http://stackoverflow.com/questions/19755031/how-javafx-application-thread-works? AFAIK Firebase는 메인 스레드에서'onComplete' 콜백을 트리거하므로 JavaFX 스레드에서 UI를 호출해야합니다. – manouti
BTW 'onComplete'가 별도의 스레드에서 호출되는지 확인 하시겠습니까? 안드로이드에서는 메인 스레드에서 호출되고 JVM에서는 동일합니다. 모든 경우에, 링크 된 포스트 ('Platform.runLater')에서 메커니즘을 시도 할 수 있습니다. – manouti