0

В моем андроид приложение, которое я запустить службу, когда пользователь выходит из приложения:Firebase уведомление базы данных

ArrayList<String> eventKeys = new ArrayList<>(); 
... 
Intent intent = new Intent(this, MyService.class); 
intent.putExtra("eventKeys", eventKeys); 
startService(intent); 

Тогда в моей службы:

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() ', выполнение кода все еще продолжается. Вы должны выполнить задачу Thread внутри метода 'onChildChanged()', чтобы убедиться, что ваше уведомление показано, потому что, используя это aproach, оно может изменить значение 'notifyMessage'. И я вижу, что вы запускаете новый 'childEventListener' для каждого ключа и используете то же логическое значение. –

Смежные вопросы