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.
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die Publisher Publishers
von einem oder Subscriber
Subscribers
mehreren verwendet werden, die jeweils von einem Subscription
Subscription
verwaltet 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
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die Publisher Publishers
von einem oder Subscriber Subscribers
mehreren verwendet werden, die jeweils von einem Subscription Subscription
verwaltet werden.
Diese Schnittstellen entsprechen der Spezifikation für reaktive Datenströme . Sie gelten sowohl in gleichzeitigen als auch verteilten asynchronen Einstellungen: Alle (sieben) Methoden werden im void
"unidirektionalen" Nachrichtenstil 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. Erstellt eine in der -Methode subscribe
und gibt sie an den aufrufenden Subscriber
aus. Es veröffentlicht Elemente asynchron für den Abonnenten, normalerweise unter Verwendung von Executor
. Hier ist z. B. ein sehr einfacher Herausgeber, der nur (bei Anforderung) ein einzelnes TRUE
Element für einen einzelnen Abonnenten ausgibt. Da der Abonnent nur ein einzelnes Element empfängt, verwendet diese Klasse keine Puffer- und Bestellsteuerung, 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);
}
}
}}
Ein Subscriber
ordnet an, dass Elemente angefordert und verarbeitet werden. Elemente (Aufrufe von Subscriber#onNext
) werden nur ausgegeben, wenn sie angefordert werden, aber es können mehrere Elemente angefordert werden. Viele Abonnentenimplementierungen können dies im Stil des folgenden Beispiels anordnen, wobei eine Puffergröße von 1 einzelnen Schritten und größere Größen in der Regel eine effizientere überlappende Verarbeitung mit weniger Kommunikation ermöglichen. Bei einem Wert von 64 bleibt die Gesamtzahl der ausstehenden Anforderungen zwischen 32 und 64. Da Aufrufe der Abonnentenmethode für eine bestimmte Methode Subscription
streng geordnet sind, müssen diese Methoden keine Sperren oder flüchtigen Elemente verwenden, es sei denn, ein Abonnent verwaltet mehrere Abonnements (in diesem Fall ist es besser, stattdessen mehrere Abonnenten zu definieren, die jeweils ein eigenes Abonnement haben).
{@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 von #defaultBufferSize
bietet möglicherweise einen nützlichen Ausgangspunkt für die Auswahl von Anforderungsgrößen und -kapazitäten in Flow-Komponenten basierend auf erwarteten Raten, Ressourcen und Nutzungen. Oder, wenn die Flusssteuerung nie benötigt wird, kann ein Abonnent zunächst eine effektiv unbegrenzte 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) { ... }
}}
In 9 hinzugefügt.
Java-Dokumentation für java.util.concurrent.Flow
.
Teile dieser Seite sind Änderungen, die auf Arbeiten basieren, die vom Android Open Source Project erstellt und freigegeben wurden und gemäß den In der Attribution License beschriebenen Begriffen verwendet werden.
Eigenschaften
Class |
Gibt die Laufzeitklasse dieses |
Handle |
Das Handle zum zugrunde liegenden Android-instance. (Geerbt von Object) |
JniIdentityHashCode |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
JniPeerMembers |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
PeerReference |
Miteinander verbundene 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 den Verleger- oder Abonnentenpuffer zurück, der ohne andere Einschränkungen verwendet werden kann. |
Dispose() |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
Dispose(Boolean) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
Equals(Object) |
Gibt an, ob ein anderes Objekt diesem "gleich" 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 feststellt, dass keine Verweise mehr 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>() |
Miteinander verbundene 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() |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
Wait() |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel durch em benachrichtigen/em> oder <em>interrupted</em>.<>< (Geerbt von Object) |
Wait(Int64) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Wait(Int64, Int32) |
Bewirkt, dass der aktuelle Thread wartet, bis er aktiviert wird, in der Regel, indem <er>benachrichtigt</em> oder <em>interrupted</em> oder bis eine bestimmte Menge an Echtzeit verstrichen ist. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
IJavaPeerable.Disposed() |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.DisposeUnlessReferenced() |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.Finalized() |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.JniManagedPeerState |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
Erweiterungsmethoden
JavaCast<TResult>(IJavaObject) |
Führt eine Für Android-Runtime überprüfte Typkonvertierung aus. |
JavaCast<TResult>(IJavaObject) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |
GetJniTypeName(IJavaPeerable) |
Miteinander verbundene Schnittstellen und statische Methoden zum Einrichten von flussgesteuerten Komponenten, in denen Elemente erzeugt werden, die |