Flow Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die Publisher Publishers
von einem oder Subscriber
Subscribers
mehreren von einem Subscription
Subscription
verwalteten Element verbraucht werden.
[Android.Runtime.Register("java/util/concurrent/Flow", ApiSince=30, DoNotGenerateAcw=true)]
public sealed class Flow : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/Flow", ApiSince=30, DoNotGenerateAcw=true)>]
type Flow = class
inherit Object
- Vererbung
- Attribute
Hinweise
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die Publisher Publishers
von einem oder Subscriber Subscribers
mehreren von einem Subscription Subscription
verwalteten Element verbraucht werden.
Diese Schnittstellen entsprechen der Spezifikation für reaktive Datenströme . Sie gelten sowohl in gleichzeitigen als auch in verteilten asynchronen Einstellungen: Alle (sieben) Methoden werden im void
Nachrichtenstil "unidirektionale" definiert. Die Kommunikation basiert auf einer einfachen Form der Flusssteuerung (Methode Subscription#request
), die verwendet werden kann, um Ressourcenverwaltungsprobleme zu vermeiden, die andernfalls in pushbasierten Systemen auftreten können.
<b>Beispiele.</b> A Publisher
definiert in der Regel eine eigene Subscription
Implementierung; erstellen sie in der Methode subscribe
und ausgeben sie an den Aufruf Subscriber
. Es veröffentlicht Elemente asynchron für den Abonnent, normalerweise mit einem Executor
. Hier ist beispielsweise ein sehr einfacher Herausgeber, der nur ein einzelnes Element eines einzelnen TRUE
Abonnents ausgibt (wenn angefordert). Da der Abonnent nur ein einzelnes Element empfängt, verwendet diese Klasse keine Pufferung und Sortiersteuerung, die in den meisten Implementierungen erforderlich ist.
{@code
class OneShotPublisher implements Publisher<Boolean> {
private final ExecutorService executor = ForkJoinPool.commonPool(); // daemon-based
private boolean subscribed; // true after first subscribe
public synchronized void subscribe(Subscriber<? super Boolean> subscriber) {
if (subscribed)
subscriber.onError(new IllegalStateException()); // only one allowed
else {
subscribed = true;
subscriber.onSubscribe(new OneShotSubscription(subscriber, executor));
}
}
static class OneShotSubscription implements Subscription {
private final Subscriber<? super Boolean> subscriber;
private final ExecutorService executor;
private Future<?> future; // to allow cancellation
private boolean completed;
OneShotSubscription(Subscriber<? super Boolean> subscriber,
ExecutorService executor) {
this.subscriber = subscriber;
this.executor = executor;
}
public synchronized void request(long n) {
if (!completed) {
completed = true;
if (n <= 0) {
IllegalArgumentException ex = new IllegalArgumentException();
executor.execute(() -> subscriber.onError(ex));
} else {
future = executor.submit(() -> {
subscriber.onNext(Boolean.TRUE);
subscriber.onComplete();
});
}
}
}
public synchronized void cancel() {
completed = true;
if (future != null) future.cancel(false);
}
}
}}
Eine Subscriber
Anordnung, die Elemente angefordert und verarbeitet werden. Elemente (Aufrufe von Subscriber#onNext
) werden nur ausgestellt, wenn sie angefordert werden, aber mehrere Elemente können angefordert werden. Viele Abonnentenimplementierungen können dies im Stil des folgenden Beispiels anordnen, bei dem eine Puffergröße von 1 Einzelschritten und größere Größen in der Regel eine effizientere überlappende Verarbeitung mit weniger Kommunikation ermöglichen; Beispielsweise mit dem Wert 64 behält dies insgesamt noch offene Anforderungen zwischen 32 und 64 bei. Da Aufrufe der Abonnentenmethode für einen bestimmten Subscription
Typ streng sortiert sind, ist es nicht erforderlich, dass diese Methoden Sperrungen oder Veränderliche Verwenden, es sei denn, ein Abonnent verwaltet mehrere Abonnements (in diesem Fall ist es besser, mehrere Abonnenten zu definieren, jeweils mit seinem eigenen Abonnement).
{@code
class SampleSubscriber<T> implements Subscriber<T> {
final Consumer<? super T> consumer;
Subscription subscription;
final long bufferSize;
long count;
SampleSubscriber(long bufferSize, Consumer<? super T> consumer) {
this.bufferSize = bufferSize;
this.consumer = consumer;
}
public void onSubscribe(Subscription subscription) {
long initialRequestSize = bufferSize;
count = bufferSize - bufferSize / 2; // re-request when half consumed
(this.subscription = subscription).request(initialRequestSize);
}
public void onNext(T item) {
if (--count <= 0)
subscription.request(count = bufferSize - bufferSize / 2);
consumer.accept(item);
}
public void onError(Throwable ex) { ex.printStackTrace(); }
public void onComplete() {}
}}
Der Standardwert kann #defaultBufferSize
einen nützlichen Ausgangspunkt für die Auswahl von Anforderungsgrößen und -kapazitäten in Flow-Komponenten basierend auf erwarteten Raten, Ressourcen und Verwendungen bieten. Oder, wenn die Ablaufsteuerung nie benötigt wird, kann ein Abonnent zunächst eine effektiv ungebundene Anzahl von Elementen anfordern, wie in:
{@code
class UnboundedSubscriber<T> implements Subscriber<T> {
public void onSubscribe(Subscription subscription) {
subscription.request(Long.MAX_VALUE); // effectively unbounded
}
public void onNext(T item) { use(item); }
public void onError(Throwable ex) { ex.printStackTrace(); }
public void onComplete() {}
void use(T item) { ... }
}}
Hinzugefügt in 9.
Java-Dokumentation für java.util.concurrent.Flow
.
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses Werts |
Handle |
Das Handle für die zugrunde liegende Android-Instanz. (Geerbt von Object) |
JniIdentityHashCode |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
JniPeerMembers |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
PeerReference |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
ThresholdClass |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. (Geerbt von Object) |
ThresholdType |
Diese API unterstützt die Mono für Android-Infrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen. (Geerbt von Object) |
Methoden
Clone() |
Erstellt und gibt eine Kopie dieses Objekts zurück. (Geerbt von Object) |
DefaultBufferSize() |
Gibt einen Standardwert für Publisher- oder Subscriber-Pufferung zurück, der möglicherweise ohne andere Einschränkungen verwendet werden kann. |
Dispose() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
Dispose(Boolean) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
Equals(Object) |
Gibt an, ob ein anderes Objekt "gleich" diesem Objekt ist. (Geerbt von Object) |
GetHashCode() |
Gibt einen Hashcodewert für das Objekt zurück. (Geerbt von Object) |
JavaFinalize() |
Wird vom Garbage Collector für ein Objekt aufgerufen, wenn die Garbage Collection bestimmt, dass keine weiteren Verweise auf das Objekt vorhanden sind. (Geerbt von Object) |
Notify() |
Aktiviert einen einzelnen Thread, der auf dem Monitor dieses Objekts wartet. (Geerbt von Object) |
NotifyAll() |
Aktiviert alle Threads, die auf dem Monitor dieses Objekts warten. (Geerbt von Object) |
SetHandle(IntPtr, JniHandleOwnership) |
Legt die Handle-Eigenschaft fest. (Geerbt von Object) |
ToArray<T>() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
ToString() |
Gibt eine Zeichenfolgendarstellung des Objekts zurück. (Geerbt von Object) |
UnregisterFromRuntime() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch em benachrichtigt/em> oder <em>unterbrochen</em>.<>< (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er wach ist, in der Regel durch <em>benachrichtigt</em> oder <em>unterbrochen</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.DisposeUnlessReferenced() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.Finalized() |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.JniManagedPeerState |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
IJavaPeerable.SetPeerReference(JniObjectReference) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine android-laufzeitgecheckte Typkonvertierung aus. |
JavaCast<TResult>(IJavaObject) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |
GetJniTypeName(IJavaPeerable) |
In Beziehung stehende Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen elemente erzeugt werden, die |