Flow 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
建立流程控制元件的相互關聯介面和靜態方法,其中 Publisher Publishers 會產生由 一或多個 Subscriber
Subscribers所管理 Subscription
Subscription的專案。
[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
- 繼承
- 屬性
備註
建立流程控制元件的相互關聯介面和靜態方法,其中 Publisher Publishers 會產生由 一或多個 Subscriber Subscribers所管理 Subscription Subscription的專案。
這些介面會對應至 回應式數據流 規格。 它們同時套用至並行和分散式異步設定:所有 (七) 方法都是以 void 「單向」訊息樣式定義。 通訊依賴簡單的流程控制(方法 Subscription#request)形式,可用來避免在「推送」型系統中可能發生的資源管理問題。
<b>範例。</b> A Publisher 通常會定義自己的 Subscription 實作;在 方法中建構一個 , subscribe 並將它發出給呼叫 Subscriber的 。 它會以異步方式將項目發行至訂閱者,通常是使用 Executor。 例如,以下是非常簡單的發行者,它只會對單一訂閱者發出單 TRUE 一項目的問題。。 由於訂閱者只接收單一專案,因此此類別不會在大部分實作中使用所需的緩衝和排序控件。
{@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);
}
}
}}
會 Subscriber 排列要求和處理的專案。 除非要求,否則不會發出專案( Subscriber#onNext調用),但可能會要求多個專案。 許多「訂閱者」實作可以透過下列範例的樣式來排列此作業,其中緩衝區大小為1個單一步驟,而較大的大小通常允許更有效率的重疊處理,且通訊較少:例如,值為 64,這會保留 32 到 64 之間的未處理要求總數。 由於指定的 Subscription 訂閱者方法調用是嚴格排序的,因此,除非訂閱者維護多個訂閱,否則不需要這些方法使用鎖定或變動性(在此情況下,最好改為定義多個訂閱者,每個訂閱都有自己的訂閱者)。
{@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() {}
}}
的預設值 #defaultBufferSize 可能會根據預期的速率、資源和使用量,提供在 Flow 元件中選擇要求大小和容量的有用起點。 或者,當不需要流程控制時,訂閱者一開始可能會要求有效未系結的項目數目,如下列所示:
{@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) { ... }
}}
已在 9 中新增。
的 java.util.concurrent.FlowJava 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
| Class |
傳回這個 |
| Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
| JniIdentityHashCode |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| JniPeerMembers |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| PeerReference |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 (繼承來源 Object) |
| ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 (繼承來源 Object) |
方法
| Clone() |
建立並傳回這個 對象的複本。 (繼承來源 Object) |
| DefaultBufferSize() |
傳回發行者或訂閱者緩衝的預設值,這個值可能會在沒有其他條件約束的情況下使用。 |
| Dispose() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| Dispose(Boolean) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
| GetHashCode() |
傳回此物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
當垃圾收集決定不再參考物件時,垃圾收集行程在 物件上呼叫。 (繼承來源 Object) |
| Notify() |
喚醒正在等候此物件監視器的單一線程。 (繼承來源 Object) |
| NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| ToArray<T>() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| Wait() |
讓目前線程等候直到喚醒為止,通常是藉由em <notified/em>或<em>interrupted</em> 來喚醒它。<> (繼承來源 Object) |
| Wait(Int64, Int32) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
| Wait(Int64) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
明確介面實作
| IJavaPeerable.Disposed() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.DisposeUnlessReferenced() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.Finalized() |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.JniManagedPeerState |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
擴充方法
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
| JavaCast<TResult>(IJavaObject) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |
| GetJniTypeName(IJavaPeerable) |
建立流程控制元件的相互關聯介面和靜態方法,其中 |