addChildEventListener不适用于java应用程序
我正在尝试在Java应用程序中实现Firebase admin SDK。我想将addChildEventListener不适用于java应用程序,java,firebase,firebase-realtime-database,firebase-admin,Java,Firebase,Firebase Realtime Database,Firebase Admin,我正在尝试在Java应用程序中实现Firebase admin SDK。我想将childeventlistener添加到child中,当添加child时,我想获取child的值并存储到系统剪贴板中。这是我迄今为止的main.java文件: import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import com.google.firebase.auth.FirebaseCreden
childeventlistener
添加到child中,当添加child时,我想获取child的值并存储到系统剪贴板中。这是我迄今为止的main.java
文件:
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.auth.FirebaseCredentials;
import com.google.firebase.database.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
FileInputStream serviceAccount =
new FileInputStream("path/to/.jason");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
.setDatabaseUrl("xxxxxxxxxx")
.build();
Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection data;
FirebaseApp.initializeApp(options);
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference ref = firebaseDatabase
.getReference().child("ClipSync");
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
cliptext string = dataSnapshot.getValue(cliptext.class);
Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection data;
data = new StringSelection(string.getText());
c.setContents(data, data);
System.out.println("Child added");
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
while (true){}
}
}
Mycliptext
class:
public class cliptext {
String text;
public cliptext(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
我面临的问题是:
注意:没有获得任何编译时间或运行时错误&我在linux中使用intellij idea。您需要添加一个构造函数,该构造函数不向
cliptext
类中添加任何参数。《基本法》明确指出:
- 该类必须具有不接受参数的默认构造函数
- 类必须为要分配的属性定义公共getter。当实例被反序列化时,没有公共getter的属性将被设置为其默认值
可能无法解决所有问题,但最终您也需要这样做;) 我不确定,但希望AdminSDK类似于客户端SDK,在客户端SDK中,侦听器回调在“主”线程上运行
在方法
main()
的末尾,您有一个繁忙的等待循环,while(true){}
。您这样做可能是为了阻止main()
完成,这将导致您的应用程序终止。这样做完全占用了主线程,并且从来没有给侦听器运行的机会。您需要找到另一种暂停main()
的方法,以使回调有机会运行。我对管理SDK中的线程知之甚少,但我想知道为什么在main()
的末尾有while(true){}
,以及这是否会影响侦听器的运行能力。还可以将System.out.println()
添加到onCancelled()
以查看是否正在调用它。@BobSnyder可能正在使用该while(true){}
hack来防止他的应用程序在等待网络响应时终止。总之,奇怪的东西…;)@保罗马托斯:可能是真的。那么在AdminSDK中,回调是否在主线程上运行?我猜是的。@BobSnyder我会说是的,因为Firebase在其他平台上就是这么做的。如果是这样,正如您最初所说,这将导致死锁情况…@Bob Synder ya,while循环用于阻止我的应用程序退出,因为我想将其作为后台运行。ya thx buddy,这是正确的答案。我只需要在cliptext类中添加没有参数的构造函数。Thxx它工作吗