2016-07-21 11 views
1

Wie Sie die RecyclerView Dataset aus dem Hintergrund-Service aktualisieren. Der Dienst unterhält eine Socket-Verbindung mit dem Server, und wenn der Server mit Daten antwortet, muss service dies in der Recycler-Ansicht (dh in der MainActivity) aktualisieren.Update `RecyclerView` Datensatz von einem Service

+0

Spezifische, zeigen Sie Ihre Versuche, das Problem zu lösen – injecteer

Antwort

2

Es gibt viele Möglichkeiten, ein Ereignis von Serivce an Activity zu senden.
Ich empfehle Ihnen den folgenden Weg.

Bind und Rückrufe

Ich denke, dass Bind und Rückrufe offizielle Weg ist.
Communication between Activity and Service
Example: Communication between Activity and Service using Messaging

EventBus

Ich denke, dass EventBus einfacher Weg ist.
https://github.com/greenrobot/EventBus

In Aktivität (oder wo):

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     BusHolder.getInstnace().register(this); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     BusHolder.getInstnace().unregister(this); 
    } 

    @Subscribe 
    public void onDatasetUpdated(DataSetUpdatedEvent event) { 
     //Update RecyclerView 
    } 
} 

BusHolder hält BusEvent Beispiel:

public class BusHolder { 

    private static EventBus eventBus; 

    public static EventBus getInstnace() { 
     if (eventBus == null) { 
      eventBus = new EventBus(); 
     } 
     return eventBus; 
    } 

    private BusHolder() { 
    } 
} 

Die Veranstaltung gepostet:

public class DataSetUpdatedEvent { 
    //It is better to use database and share the key of record of database. 
    //But for simplicity, I share the dataset directly. 
    List<Data> dataset; 

    public DataSetUpdatedEvent(List<Data> dataset) { 
     this.dataset = dataset; 
    } 
} 

Nachricht von Ihrem Service .

BusHolder.getInstnace().post(new DataSetUpdatedEvent(dataset)); 

Ich hoffe, das hilft.

0

Möglicherweise sollten Sie einige Datenbank wie Ding verwenden, um temporäre Daten zu speichern, weil ich nicht denke, dass es eine gute Sache ist, Daten in einem Objekt im Auftrag der Servicekomponente zu speichern. Es wäre überflüssig, ganze Listendaten im Objekt zu speichern, egal ob der Benutzer zur App zurückkehrt oder ob das Objekt den Speicher abdeckt, was wir während des gesamten Entwicklungsprozesses vermeiden sollten. Viel Glück.

+0

für Chat-ähnliche Anwendungen gibt es keine Notwendigkeit, Daten auf dem Gerät zu speichern – injecteer

+0

Der Dienst fügt auch die Daten in den SQLite-Server (von Android) und Updates in der Recyclerview zu. –