2013-12-09 5 views
6

I mit 2 Klassen,Update Listenansicht in meiner Tätigkeit aus dem Dienst android

1.Activity Klasse

2.Service Klasse

Ich muss meine Listenansicht in meiner Tätigkeit aktualisieren, wenn Service bekam irgendwelche Updates. Eigentlich versuche ich wie eine Chat-Anwendung, Meine Dienste überprüfen immer meine db und wenn es eine neue Zeichenfolge, muss ich in meiner Aktivität aktualisieren, ohne die neu zu erstellen, nur ich brauche die Listenansicht zu aktualisieren. Ich fand, dass es mit iBinder manipuliert wird, aber ich benutze es nicht. Kann mir jemand ein paar Code-Beispiele vorschlagen?

referred pages

Antwort

4

sollten Sie einen Bound Service verwenden. Ich habe das etwas ähnliches in meiner Bewerbung gemacht. Wenn ich auf "Aktualisieren" klicke, rufe ich einen Dienst auf, der Daten im Hintergrund erhält und die Benutzeroberfläche aktualisiert.

überprüfen meinen Dienst hier aus: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override 
protected void onPostExecute(AnalyticsAccountResult result) { 
    super.onPostExecute(result); 
    App.getEventBus().post(result); 
} 

Aktivität: https://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe 
public void UpdateUI(AnalyticsAccountResult result) { 
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress); 
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout); 
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage); 

    switch (result.getStatus()) { 
     case STARTING: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.VISIBLE); 
     spinnerLayout.setVisibility(View.GONE); 
     break; 

     case FAILURE: 
     statusMessage.setVisibility(View.VISIBLE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.GONE); 
     statusMessage.setText(result.getErrorMessage()); 
     break; 

     case SUCCESS: 
     statusMessage.setVisibility(View.GONE); 
     progressbar.setVisibility(View.GONE); 
     spinnerLayout.setVisibility(View.VISIBLE); 

     if (result.getItems() != null) 
     { 
      this.acProfiles = result.getItems(); 
      MyAdapter myAdapter = new MyAdapter(acProfiles, this); 
      listView.setAdapter(myAdapter); 
      UpdateSelectionPreferences(); 
      if (result.isPersist() && acProfiles.size() > 0) 
      { 
       if (App.LOCAL_LOGV) 
       Log.v(App.TAG, "saving configdata");   
       try 
       { 
        appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName()); 
       } 
       catch (JsonProcessingException e) 
       { 
        Log.e(App.TAG, e.getMessage()); 
       } 
      } 
     } 
     break; 
    } 
} 

Es wäre auch hilfreich Otto-Bibliothek zu verwenden:
http://square.github.io/otto/

0

Ohne weitere Informationen I kann stellen Sie keine nützlichen Codebeispiele bereit, aber ich denke, Sie suchen nach einem ListAdapter. Ein ListAdapter nimmt eine Listenansicht und ein Dataset (in Ihrem Fall vielleicht ein Array von Strings) und kombiniert die 2. Wenn sich das Dataset ändert (in Ihrem Fall wäre dies der Fall, wenn Ihr Dienst eine neue Zeichenfolge erkennt und sie dem Array hinzufügt) Rufen Sie ListAdapter.notifyDataSetChanged() auf, und die Listenansicht wird automatisch mit Ihren neuen Informationen aktualisiert. Überprüfen Sie http://developer.android.com/reference/android/widget/ArrayAdapter.html für weitere Informationen zu dem spezifischen ListAdapter, den Sie möglicherweise verwenden.

+1

Danke für Ihre Antwort, .. Eigentlich hast du recht. Aber meine Frage ist, woher weiß ich, dass sich die Daten von meiner Aktivität geändert haben. Wie sollte ich von meinem Service erfahren? – GaneshKumar

+0

Ich musste das nicht persönlich tun, also kann ich nicht mit Sicherheit sagen, welche Methode die beste ist, aber ich denke, dass ein [BroadcastReceiver] (http://developer.android.com/reference/android/content/BroadcastReceiver.html) würde Arbeite für dich. Es ist eine abstrakte Klasse, die Nachrichten verarbeiten kann, die von einem Dienst gesendet werden. Der Dienst verwendet die sendBroadcast() -Methode, wenn er eine neue Zeichenfolge findet und Ihre Aktivität als BroadcastReceiver registriert wird, der bei Empfang einer Broadcast-Aktion eine Aktion ausführt. – csmckelvey

3

Nehmen wir an, Sie haben die Aktivitätsklasse MainActivity, in der Sie Ihren ListView mit dem Adapter namens listviewAdapter initialisiert haben. Diesen Code in MainActivity:

public static Handler UIHandler; 

    static { 
     UIHandler = new Handler(Looper.getMainLooper()); 
    } 

    public static void runOnUI(Runnable runnable) { 
     UIHandler.post(runnable); 
    } 

Wenn Sie Änderungen an Ihren Listview-Daten in Ihrer Service-Klasse gemacht, schreiben Sie diesen Code neue Daten an die Listview anwenden:

MainActivity.runOnUI(new Runnable() 
{ 
    public void run() 
    { 
     try 
     { 
      MainActivity.listviewAdapter.notifyDataSetChanged(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

Das ist nett, funktioniert jetzt, aber ich habe Angst vor einigen Thread-bezogenen Ausnahmen nach: / – Reda

Verwandte Themen