0

Also von dem, was ich gelesen habe, Android AsyncTask ist eine gute Möglichkeit, asynchron Informationen aus dem Internet zu laden. Ich möchte jedoch nicht die Benutzeroberfläche blockieren und verhindern, dass der Benutzer damit interagiert.Wie kann ich die Benutzeroberfläche problemlos aktualisieren?

Eine grundlegende Beschreibung meines Problems.

Momentan verwende ich Websockets, um Daten von einem Webserver zu senden/empfangen. Bei Ereignissen wie einem Benutzer, der den Raum betritt, einem Lied, das einer Playlist hinzugefügt oder aus ihm entfernt wird, einem Lied, das aufwärts oder abwärts bewegt wird, oder einem Liedende und einem anderen Anfang, muss die UI aktualisiert werden, um Änderungen anzuzeigen. Aber im Idealfall werden diese Änderungen sehr häufig auftreten, was bedeutet, dass das ständige Blockieren der Benutzeroberfläche, um sie zu aktualisieren, mühsam und ärgerlich wäre.

Wie würde ich meine Benutzeroberfläche aktualisieren, ohne den Benutzer bei seinen Aktivitäten zu unterbrechen? Würde AsyncTask ausreichen?

+0

AsyncTask ist nicht der einzige Weg. Es gibt auch Handler und Loopers. Lesen Sie dazu in [Mit dem UI-Thread kommunizieren] (https://developer.android.com/training/multiple-threads/communicate-ui.html) gefolgt von Halten Sie Ihre App Responsive. –

Antwort

1

Die asyncTask blockiert die Benutzeroberfläche nicht. Es wird in einem separaten Thread ausgeführt, um die Daten aus dem Internet zu senden/empfangen, und gibt dann die Ergebnisse zurück. Wenn Sie die Ergebnisse zurück erhalten, können Sie die Benutzeroberfläche wie gewünscht aktualisieren.

Ihre UI wird nicht gestoppt, während der asyncTask seine Hintergrundarbeit ausführt. Sie können es ausprobieren, indem Sie einen in Ihrer Aktivität erstellen und einfach für eine gewisse Zeit (sagen wir fünf Sekunden) in der doInBackground Methode schlafen. Sie werden sehen, dass Ihre Benutzeroberfläche während dieser fünf Sekunden noch funktionsfähig ist.

Bearbeiten: Sie können fast alles mit den Ergebnissen tun, die Sie zurück erhalten, und es wird auch nicht Ihre Benutzeroberfläche unterbrechen. Wenn das nicht der Fall ist, werden Sie wahrscheinlich untersuchen wollen, was Sie mit Ihren im Speicher befindlichen Objekten tun. Alles, was nicht im Speicher gespeichert ist, sollte wahrscheinlich mit einer AsyncTask auf Festplatte, Datenbank oder Internet-Endpunkt abgerufen oder geschrieben werden. Wie der Kommentator oben bemerkt, ist dies nicht der einzige Weg, andere Threads zu verwenden, aber es ist einfach und wird wahrscheinlich funktionieren, wenn Sie eine vernünftige Web-Anfrage machen und erwarten, dass die Benutzer eine anständige Verbindung haben. Sie sollten nur sicherstellen, dass Sie Timeouts und Ausnahmen berücksichtigen, damit Ihre App nicht abstürzt, wenn die Aufgabe länger dauert als erwartet.

public class LoadCommentList extends AsyncTask<Integer, Integer, List<Comment>> { 
    private String commentSubject; 

    public LoadCommentList(commentSubject){ 
     this.commentSubject = commentSubject; 
    } 

    // Do the long-running work in here 
    protected List<Comment> doInBackground(Integer... params) { 
     // the data producer is a class I have to handle web calls 
     DataProducer dp = DataProducer.getInstance(); 

     // here, the getComments method makes the http call to get comments 
     List<Comment> comments = dp.getComments(commentSubject); 

     return comments; 
    } 

    // This is called each time you call publishProgress() 
    protected void onProgressUpdate(Integer... progress) { 
     // setProgressPercent(progress[0]); 
    } 

    // This is called when doInBackground() is finished 
    protected void onPostExecute(List<Comment> comments) { 
     // calls a method in the activity to update the ui 
     updateUI(comments); 
    } 
} 

Es gibt sauberere Beispiele tatsächlich die Integer ... params zum Beispiel verwenden, aber das ist nur etwas, das ich praktisch als Beispiel hatte.

+0

Wenn ich also socket.io verwende, wo würde ich die Socket-Verbindung einrichten, in der Aktivität oder der AsyncTask? – Quontas

+0

Verwenden Sie Ihre AsyncTask, um die lang andauernde Arbeit zu erledigen. Ich habe die Antwort aktualisiert, um ein Beispiel zu zeigen. Richten Sie Ihre Socket-Verbindung in der AsyncTask ein, aber Sie können auch andere Klassen oder Methoden verwenden, um Ihren Code sauber und lesbar zu halten. –

+0

Wird die AsyncTask nur einmal ausgeführt? Wenn es nur einmal ausgeführt wird, gibt es eine Möglichkeit, eine AsyncTask ständig auszuführen? – Quontas

0

Ich weiß nicht, wo Sie das lesen, aber asyn Aufgabe sind die schlechteste Möglichkeit, Web-Service-Aufruf in diesen Tagen zu machen. Sie sollten Retrofit für Serviceaufruf verwenden, es ist 8 Mal schneller und handhabt UI-Aktualisierung reibungslos. Mehr dazu lesen Sie hier: -

http://googleweblight.com/?lite_url=http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit&ei=qR4bQU5c&lc=en-IN&s=1&m=260&host=www.google.co.in&ts=1465531978&sig=APY536z0v15lfX3G6KY4nls4wf1kzttJdA