Wie bekomme ich Ergebnisse aus einem IntentService zurück in eine Aktivität?
Ich bin mit einem IntentService zur Verarbeitung von Netzwerk-Kommunikation mit einem server über JSON. Die JSON - /server-Teil ist in Ordnung, aber ich habe Probleme dabei, die Ergebnisse zurück, wo Sie benötigt werden. Der folgende code zeigt, wie ich die Absicht Dienst von innen onClick(), und dann mit der service-update eine Globale variable zu geben die Ergebnisse zurück an die zentrale Aktivität.
public class GXActivity extends Activity {
private static final String TAG = "GXActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
//=== called when the activity is first created
Log.i(TAG, "GXActivity Created");
super.onCreate(savedInstanceState);
setContentView(R.layout.start);
View.OnClickListener handler = new View.OnClickListener() {
public void onClick(View v) {
//=== set up an application context to hold a global variable
//=== called user, to contain results from the intent service
GXApp appState = ((GXApp) getApplicationContext());
User user = new User(-1); //initialize user id to -1
appState.setUser(user);
//=== next start an intent service to get JSON from the server;
//=== this service updates the user global variable with
//=== results from the JSON transaction
Intent intent = new Intent(this, GXIntentService.class);
startService(intent);
//=== check app context for results from intent service
appState = ((GXApp) getApplicationContext());
if (appState.getUser().getId() != -1)...
}
}
}
}
Das problem das ich habe ist, dass der Vorsatz service Parsen der JSON nicht aufgerufen, bis nach der onCreate () - abgeschlossen, also mein code sieht für die Ergebnisse ist, stecken suchen, auf nicht initialisierten Ergebnisse.
Was sollte ich anders machen, so die Absicht-service wird aufgerufen, bevor ich die Ergebnisse überprüfen? Würde es funktionieren, wenn ich zog die Klick-listener aus der onCreate () - Funktion? Gibt es eine andere/bessere Struktur dieser code? Vielen Dank.
InformationsquelleAutor der Frage gcl1 | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie sich die Erstellung Ihrer eigenen
ResultReceiver
Unterklasse in Ihre Tätigkeit.ResultReceiver
implementiertParcelable
so können übergeben werden von IhremActivity
zu IhremService
als extra auf derIntent
.Müssen Sie etwas tun, wie dieses:
Implementieren Sie eine Unterklasse von
ResultReceiver
in Ihrem activity-Klasse. Die key-Methode zu implementieren istonReceiveResult()
. Diese Methode bietet Ihnen eine mitBundle
von Ergebnis-Daten, die übergeben werden können, was auch immer Informationen, die Sie abrufen, die in IhremService
. Entpacken Sie einfach die Daten, die Sie brauchen, und verwenden Sie es, um zu aktualisieren Sie Ihre Aktivität.In Ihrer Tätigkeit erstellen Sie eine neue Instanz der benutzerdefinierten
ResultReceiver
und fügen Sie es in dieIntent
Sie verwenden, um start Ihren Dienst.In Ihrem
Service
'sonStartCommand()
- Methode abrufen derResultReceiver
übergeben, auf derIntent
und speichert ihn in einer lokalen member-Variablen.Einmal Ihre
Service
seine Arbeit abgeschlossen ist, müssen Sie es nennensend()
auf die ResultReceiver vorbei, was auch immer Daten, die Sie senden möchten, zurück zu den Aktivitäten, die inBundle
.Dies ist eine ziemlich effektive Muster und bedeutet, dass Sie nicht die Speicherung von Daten in fiesen statischen Variablen.
InformationsquelleAutor der Antwort tomtheguvnor
Es gibt viele Möglichkeiten, das zu tun, stopft sich im hintergrund immer wieder ein Ergebnis (AsyncTask, binden Sie eine Aktivität, die einen Service...), aber wenn Sie wollen, zu mantain Ihr IntentService - code können Sie einfach:
1 - senden Sie ein broadcast-intent (enthält den status in seiner erweiterten Daten) am Ende der Arbeit in Ihrem IntentService
2 - Umsetzung einer LocalBroadcastReceiver in Ihrer Aktivität konsumiert die Daten, die aus der Absicht
Dies ist auch die empfohlene Art und Weise, in der offiziellen Dokumentation (wenn Sie wollen mantain Ihr IntentService):
https://developer.android.com/training/run-background-service/report-status.html
InformationsquelleAutor der Antwort DSoldo
Wenn alles, was Sie tun müssen, ist erhalten eine JSON vom server, ohne das sperren des UI-thread, es möglicherweise einfacher, benutzen Sie einfach AsyncTask.
InformationsquelleAutor der Antwort Yusuf X
Können Sie Otto Bibliothek.
Otto ist ein Open-Source-Projekt entwickelt, um eine event-bus-Implementierung, so dass Komponenten veröffentlichen und abonnieren von events.
InformationsquelleAutor der Antwort Prashanth Debbadwar