2017-05-30 120 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()以使回調有機會運行。

相關問題