Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
addChildEventListener不适用于java应用程序_Java_Firebase_Firebase Realtime Database_Firebase Admin - Fatal编程技术网

addChildEventListener不适用于java应用程序

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

我正在尝试在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.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){}
}
}
My
cliptext
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;
}
}

我面临的问题是:

  • 当此时将子项添加到数据库时,代码应该触发addChildeventlistner,但这不会发生

  • 我可以将数据写入数据库,也可以检索数据,所以firebase管理设置中没有问题


  • 注意:没有获得任何编译时间或运行时错误&我在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它工作吗