2012-04-14 15 views
0

Ich implementierte eine kleine Android-Anwendung, die Daten von einem Server über REST API empfangen. Jede Aktivität enthält eine AsyncTask, die die angeforderten Daten vom Server abruft. Ich benutze DefaultHttpClient mit ThreadSafeConnManager, und der Client ist ein Singleton, um es wiederzuverwenden. Wenn ich die App teste und die Aktivitäten durchlaufe, gibt es ein merkwürdiges Problem: Alles funktioniert eine Weile und der Empfang der Daten dauert immer länger. Es passiert, wenn ich in einer Aktivität schnell zurück Knopf - ich vermute wegen der asynctask die Client-Verbindung hat nicht freigegeben und die neue Aufgabe kann nicht verbinden. Das Gleiche passiert jedoch, wenn ich bei jedem HttpGet eine neue Clientinstanz erstelle.Android DefaultHttpClient REST api

Ich steckte mit diesem Problem und keine Ahnung, was los ist. Jede Hilfe wird geschätzt.

Danke, und br Peter

Antwort

0

AsyncTasks bekommt etwas schwierig, vor allem bei langen Laufbetrieb. Klingt so, als hätten Sie möglicherweise mehrere Aufgaben, um Ihre Anfragen zu erfüllen. Denken Sie daran, dass Ihr Kunde zu irgendeinem Zeitpunkt während des Prozesses blockieren wird.

Ich schlage vor, Sie bewegen sich weg von asyncTasks und zu einem Thread-Dienst mit einer Anforderungswarteschlange. Wenn Sie sich für asyncTasks entscheiden, vergewissern Sie sich, dass Ihre Stornierungen ordnungsgemäß implementiert sind.

hoffe, das hilft

+0

Hallo! Ich habe versucht, die Anfragen abzubrechen. (Nicht alle Aktivitäten) Wo sollte ich die Abbruchmethoden setzen? In onPause und onDestroy Methoden? Die Abbrechen-Methode wird die Verbindung freigeben? Vielen Dank! – hcpeter

0

Dieses Problem diskutiert wurde:

Android HttpClient performance

  1. wiederum auf Debug-Level-Protokollierung für den connectionMgr, inspizieren Lifecycle Ereignisse
  2. Blick auf closeExpiredConnections() -Methode Blick um
  3. closeIdleConnections (lange idleTimeout, TimeUnit tunit)

Ich denke, dass Sie den Lebenszyklus der Verbindungen von Ihrem connectionPool ein wenig näher betrachten sollten und insbesondere, dass ungenutzte und ungenutzte Verbindungen geschlossen und wiederverwendet werden.

Sie können sich die API/Docs für den ThreadSafeConnManager anschauen oder Sie können sich die Quelle ansehen.

+0

Ich habe versucht, aber hat nicht gut funktioniert. Bei jedem Durchlauf erhalte ich nach ein paar Klicks einen unendlichen Fortschrittsbalken. – hcpeter

0

Hier ist ein richtiger Ansatz für Ihren Fall, auf der gleichen Seite von dem, was Nelson vorschlägt.

Ich würde versuchen, mehr Kontrolle über meine Anforderungen und Thread-Executoren zu nehmen. Denken Sie daran, dass der Pool von Asynctask begrenzt ist. Wenn Ihre Vorgänge lang genug sind, wird die Anfrage in die Warteschlange eingereiht.

http://joseluisugia.wordpress.com/2012/08/03/using-runnables-queues-and-executors-to-perform-tasks-in-background-threads-in-android/