2017-02-27 4 views
0

Ich möchte alle Nachrichten in der OnMessageReceived des Dienstes in einer SQLite-Datenbank empfangen.Ist FirebaseMessagingService ein Intent-Service?

Ich plante, die Datenbank zu öffnen, die Daten einzufügen und die Datenbank zu schließen. Dies würde mit einem Intent-Service gut funktionieren, da alle Aufrufe von onMessageReceived in die Warteschlange gestellt würden und somit nacheinander ausgeführt würden.

Wenn jedoch onMessageReceived für mehrere Nachrichten gleichzeitig aufgerufen wird, kann es dazu kommen, dass Probleme mit dem DB geschlossen werden, während ein anderer Aufruf versucht zu schreiben, was zu Problemen führt.

Kann jemand bestätigen, welche Art von Verhalten ich erwarten sollte.

Wenn es nicht die Absicht der Service ist, ich könnte an den DB Singletonmuster und Synchronisationsblöcke

+0

Haben Sie überprüft die Offline-Nutzung von Feuerbasis aus? –

+0

Es ist ein Service dann ... aber empfängt es Nachrichten gleichzeitig? Von dem, was ich gesehen habe, werden mehrere Nachrichten eins nach dem anderen empfangen. Aber ich bin mir nicht sicher, ob das immer so sein wird. – Kushan

+0

@JadavLalit ich glaube nicht, dass die Persistenz von Firebase db mir mit FCM helfen wird. Ist es das, worauf du dich beziehst? – Kushan

Antwort

0

Sie können LinkedBlockingDeque<> Klasse aussehen müssen prüfen, die Ihre Anfrage Warteschlangen und kann im Hintergrund nacheinander durchgeführt werden.
prüfen unten Beispielklasse von mir -

public class Processor implements Runnable { 

private final LinkedBlockingDeque<Task> mTaskQueue = new LinkedBlockingDeque<Task>(); 
private boolean mExecuteTask = true; 

@Override 
public void run() { 
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 
    // You can put some end condition if needed 
    while (mExecuteTask) { 
     Task task; 
     try { 
      // Waits if necessary until an element becomes available 
      task = (Task) mTaskQueue.take(); 
     } catch (InterruptedException e) { 
      continue; // re-test the condition on the eclosing while 
     } 
     if (task != null) { 
      task.runnable.run(); 
     } 
    } 
} 

// Call this method to put Runnable in Queue. 
public synchronized void put(int id, Runnable runnable) { 
    try { 
     Task task = new Task(); 
     task.runnable = runnable; 
     task.id = id; // someUniqueId to avoid duplication 
     // Check Id of tasks already present in Queue 
     mTaskQueue.addLast(task); 
    } catch (IllegalStateException ie) { 
     throw new Error(ie); 
    } 
} 

private static class Task { 
    public Runnable runnable; 
    // Unique Id of task 
    public int id; 
} 

}