0

Firebaseデータベース・ユーザーがアプリを終了したとき、私はサービスを開始し、私のAndroidアプリに通知

public class MyService extends Service { 

    (fields)... 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 
     if (intent == null) { 
      System.out.println("ERROR"); 
      return START_REDELIVER_INTENT; 
     } 
     eventKeys = (ArrayList<String>) intent.getExtras().get("eventKeys"); 

     //here I attach listeners to firebase database 
     firebase(); 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true) { 
        if (notifyMessage) { 
         sendNotification("You have a new message."); 
         stopSelf(); 
         return; 
        } 

        try { 
         System.out.println("Sleeping..."); 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }).start(); 
     return START_STICKY; 
    } 

、次はスリーピングプリントアウト生成...一度だけ、それ以降はエラーです。ヌルチェックを削除すると、ヌルポインタが得られます。 firebaseメソッドを削除すれば動作します。

private void firebase(List<String> eventKeys) { 
    System.out.println("Set database listener"); 
    mDataBase = FirebaseDatabase.getInstance().getReference().child("events"); 

    for (String eventKey : eventKeys){ 

     mDataBase.child(eventKey).child("chat").addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) {} 
      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       //new message received 
       notifyMessage = true; 
       sendNotification("You have a new message."); 
       stopSelf(); 
      } 
      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) {} 
      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 
      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 
    } 
} 

これは機能しませんし、何をすべきかわかりません。

+0

エラーは何ですか? –

+0

具体的なエラーはありません。しかし、私が子供を変えたときは通知は送られません。私は、このコードは私がアプリケーションを閉じるときに実行されることは言及しなかった。 – Nikola

+0

リスナーを接続する際に発生する可能性のあるエラーを無視しています。ここで書いたように 'onCancelled'を実装してください:http://stackoverflow.com/documentation/firebase/5548/how-do-i-listen-for-errors-when-accessing-the-database#t=201609121647524851802 –

答えて

1

サービスをマニフェストに宣言しましたか?

<manifest ... > 
  ... 
  <application ... > 
      <service android:name=".MyService " /> 
      ... 
  </application> 
</manifest> 

サービス自体はバックグラウンド操作なので、サービスクラスで新しいスレッドを作成する必要はありません。チェックdocumentation

+0

はい私はこれを私の目録に入れています。 – Nikola

+0

スレッドを削除すると、コードがしばらく動いています。 'Thread [3、tid = 29740、WaitingInMainSignalCatcherLoop、Thread:シグナル3に反応する] – Nikola

+0

Firebaseからのデータの取得は非同期メソッドなので'firebase()'メソッド呼び出しでは、コード実行はまだ進行中です。通知を表示するには 'onChildChanged()'メソッドの中でスレッドジョブを実行する必要があります。なぜなら、それを使って 'notifyMessage'値を変更できるからです。そして、私はあなたが各キーの新しい 'childEventListener'を開始しているのを見ることができ、同じブール値を使用します。 –

関連する問題