2016-04-20 10 views
0

Ich habe statische Methoden in einer Klasse namens Remote synchronisiert, die von einem Dienst aufgerufen werden, um Daten aus dem Netzwerk abzurufen. Der Dienst ist ein IntentService, der jedes Mal gestartet wird, wenn der Benutzer in der Benutzeroberfläche eine Liste nach unten scrollt und weitere Elemente abgerufen werden müssen. Die Methoden werden synchronisiert, da sie auch aus einer anderen Quelle, dem Syncadapter, aufgerufen werden. Zwei Aufrufe derselben Methode in Remote können nicht verschachtelt werden. Aber da mein Syncadapter in einem separaten Prozess ausgeführt wird, der die Methoden synchronisiert, wird die Threadsicherheit nicht erzwungen und ich bekam inkonsistente Zustände.android Synchronisierungsmethoden über Prozesse hinweg

Ich löste dies, indem ich den Syncadapter zurück in den Hauptprozess laufen ließ. Genauer gesagt Entfernen des Werts android:process aus dem Synchronisierungsdienst. Aber ich habe mich gefragt, ob es eine viel robustere Vorgehensweise gibt, die unabhängig von der Position des Syncadapters funktioniert.

+0

ich mit SyncAdapter behandelt haben nicht viel, aber können Sie eine Synchronisierung des SyncAdapter "erzwingen", anstatt die synchronisierte Methode aufzurufen? –

+0

Ja, aber die Logik ist anders. Im syncadapter rufe ich 3 oder 4 dieser synchronisierten Methoden auf, aber wenn sie über die Service Route aufgerufen werden, wird immer nur einer von ihnen aufgerufen. –

Antwort

0

Ich bin kein Android-Entwickler, aber ich denke, dass Sie möglicherweise zwischen Prozessen und Threads verwirrt werden.

Ein Prozess verfügt über eine eigenständige Ausführungsumgebung. Ein Prozess verfügt im Allgemeinen über einen vollständigen, privaten Satz grundlegender Laufzeitressourcen. insbesondere hat jeder Prozess seinen eigenen Speicherplatz. source

Wenn Sie den SyncAdapter als Prozess gestartet hat es keine Kenntnis von dem anderen Prozess (oder deren Fäden), die den gleichen syncronized Block verwenden, und jeder wird eine Sperre in ihrem eigenen Speicherbereich zu erhalten.

Ich denke, Sie sollten den SyncAdapter als ein Thread von Ihrem Hauptprozess starten, da auf diese Weise die Threads blockiert werden, während der andere im synchronisierten Block ist.

1

Ein paar Punkte:

  • Sie alle Netzwerk-bezogenen Code in einem IntentService platzieren und schicken Sie es an verschiedenen Orten Absichten die Aufgabendetails als Statisten vorbei. IntentService wird diese Absichten sequentiell verarbeiten;

  • Innerhalb eines Prozesses können Sie FutureTask [1] oder Volleys RequestFuture <> [2] -Klasse verwenden, um Ihre Netzwerkanforderungen zu synchronisieren.

[1] ein Beispiel sehen, wie FutureTask verwenden Neustarten die gleiche Operation zu verhindern: http://jcip.net/listings/Memoizer3.java

[2] siehe Beispiele hier: Can I do a synchronous request with volley?

Verwandte Themen