2017-05-30 115 views
-1

我试图在Java应用程序中实施Firebase管理软件开发工具包。我想给孩子添加childeventlistener,并且当孩子添加了我想要孩子的价值并且存储到系统剪贴板时。这里是我的main.java文件至今:addChildEventListener不适用于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){} 
} 
} 

cliptext类:

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; 
} 

}

问题,我面对:

  1. 当孩子在添加到数据库那个时间代码应该触发addChildeventlistner但没有发生。

  2. 我可以写入数据到数据库,也能够检索它,所以在firebase-admin设置中没有问题。

注:我使用在Linux的IntelliJ IDEA没有得到任何编译时或运行时错误&。

+1

我对Admin SDK中的线程知之甚少,但我想知道为什么在main()的末尾有'while(true){}',并且这是否会影响侦听器的能力跑。还要在'onCancelled()'中添加一个'System.out.println()'来查看它是否被调用。 –

+0

@BobSnyder他可能正在使用'while(true){}'来防止他的应用程序在*等待网络响应时终止*。无论如何,奇怪的东西...;) –

+0

@PauloMattos:可能是真的。那么在Admin SDK中,回调是否在主线程上运行?我猜是的。 –

回答

0

您需要添加一个构造函数,它将无参数添加到您的cliptext类中。该Firebase documentation了这一点:

  • 的类必须有一个默认的构造函数,它没有参数

  • 类必须定义一个公共的getter为要分配的属性。没有一个公共的getter属性将被设置为默认值,当一个实例进行反序列化

也许不能解决所有你的问题,但你需要做到这一点,以及最终;)

+0

亚thx哥们这是正确的答案。我只需要在我的cliptext类中添加没有参数的构造函数。它的工作 –

0

我不确定,但期望Admin SDK类似于客户端SDK,其中监听器回调在“主”线程上运行。

方法main()结束时,您有一个忙碌等待循环while (true){}。您可能会这样做,以防止main()完成,这会导致您的应用程序终止。这样做完全占据主线程,从不给听者一个运行的机会。您将需要找到另一种方法来暂停main()以使回调有机会运行。

相关问题