2016-11-04 63 views
0

我試圖在Andorid Xamarin中使用RX。
你知道如何使用:
Observable.SubscribeOn(..)使用線程默認池做後臺任務申報 Observable.ObserveOn(..)從可觀察的事件重定向到UI線程Xamarin中的SubscribeOn/ObserveOn示例Android

根據SubscribeOn我嘗試了所有ISchedulers 從
System.Reactive.PlatformServices.dll/System.Reactive.Concurrency
即:

NewThreadScheduler.Default 
TaskPoolScheduler.Default 
ThreadPoolScheduler.Instance 

並沒有什麼效果。

在ohter手[如果可能的話]我不想手動:
- 裏面創建我的線程可觀測
- 在觀測使用RunOnUiThread

= = = =更新= =

NewThreadScheduler.Default
代碼測試結果:

Console.WriteLine("creating ole"); 
var ole = Observable.Create<string>(suber => 
{ 
    Console.WriteLine("inside ole"); 
    Thread.Sleep(5000); 
    suber.OnNext("point1"); 
    suber.OnCompleted(); 
    Console.WriteLine("ole completed"); 
    return Disposable.Create(() => Console.WriteLine("observer unsubscribed")); 
}); 
ole.SubscribeOn(NewThreadScheduler.Default); 
Console.WriteLine("subscribing"); 
oleSub = ole.Subscribe(s => Console.WriteLine("result: " + s)); 
Console.WriteLine("subscribed"); 

輸出:

creating ole 
subscribing 
inside ole 
result: point1 
ole completed 
observer unsubscribed 
subscribed 

結論:
可觀察到的內容在主線程中執行,但預計運行其自己的線程:ole.SubscribeOn(NewThreadScheduler.Default);

+0

「並沒有什麼作品」 但你是什麼真正看到?我在Xamarin中經常使用這些方法而沒有問題。 'myObservable.SubscribeOn(NewThreadScheduler.Default)...' – flakes

回答

1

的Rx是基於函數編程,其中的一個主要租戶是側 - 免費編程。

當您創建var ole = Observable.Create...時,您正在創建可觀察序列。當某些東西訂閱它時,這個序列就會有行爲。

當你再試着設置了上ole.SubscribeOn(NewThreadScheduler.Default);你與SubscribeOn行爲裝修ole可觀察序列的訂閱,但這樣做是沒有副作用的操作,它返回一個新的觀察到的序列。您不會將返回的實例分配給任何內容。即代碼行ole.SubscribeOn(NewThreadScheduler.Default);什麼都不做。

然後,您可以回到原始未修改的ole可觀察序列並訂閱該文件。

我有兩個建議

  1. 創建日誌幫手運營商刪除代碼的所有Console.Write噪音。這對於您在調試Rx代碼時使用它們都是有用的,並且還可以讓您學習如何創建一個Rx操作符(這將是無副作用的)。 https://github.com/LeeCampbell/RxCookbook/blob/34ac4f3536b00bbe259384d3bf0e8746da3311cc/Instrumentation/Logging.md
  2. 鏈接你的方法,讓你真正得到你想要的行爲。

這裏我們正確使用SubscribeOn方法。我們還使用您可以從上面的鏈接自行編寫的Log擴展方法。

var ole = Observable.Create<string>(obs=> 
{  
    Thread.Sleep(5000); //Dont use Thread.Sleep and Rx :-) 
    obs.OnNext("point1"); 
    obs.OnCompleted(); 
    return Disposable.Empty; 
}); 
var oleSubscription = ole 
    .Log("ole") 
    .SubscribeOn(NewThreadScheduler.Default) 
    .ObserveOn(/*What ever Android's UI Thread Scheduler is*/) 
    .Subscribe(s => Console.WriteLine("result: " + s)); 

另請注意,我也添加了ObserveOn運算符。我強烈建議這兩種方法的用戶只在最終用戶(可能是您的ViewModel?)上使用它們,並且只能在上述Subscribe方法之前將它們用作最後​​的運營商。

更多的幫助:

+1

簡而言之:我訂閱了錯誤的Observable。 @Lee修復代碼工作後。 TNX! –