在Xamarin Android中使用SubscribeOn / ObserveOn的示例

时间:2016-11-04 15:42:48

标签: android xamarin system.reactive reactive-programming

我正试图在Andorid Xamarin中使用RX 你知道怎么用:
Observable.SubscribeOn(..)声明使用默认池中的线程来执行后台任务 Observable.ObserveOn(..)将事件从Observable重定向到UI线程

根据SubscribeOn我尝试了所有的ISchedulers 从
System.Reactive.PlatformServices.dll / System.Reactive.Concurrency
那就是:

NewThreadScheduler.Default
TaskPoolScheduler.Default
ThreadPoolScheduler.Instance

没有任何作用。

在手上[如果可能]我不想手动:
- 在Observable中创建我的线程
  - 在Observer中使用RunOnUiThread

= = = update = = =

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);

1 个答案:

答案 0 :(得分:1)

Rx基于功能编程,其中一个关键租户是无副作用的编程。

创建var ole = Observable.Create...时,您正在创建一个可观察的序列。当订阅它时,该序列将具有行为。

当您尝试设置订阅ole.SubscribeOn(NewThreadScheduler.Default);时,您正在使用 SubscribeOn 行为装饰ole可观察序列,但这是一个无副作用的操作,它返回一个新的可观察序列。您不会将返回的实例分配给任何内容。即ole.SubscribeOn(NewThreadScheduler.Default);代码行无效。

然后返回原始未修改的ole可观察序列并订阅该序列。

我有两个建议

  1. 创建一个Logging助手操作符,以删除代码中的所有Console.Write噪音。这对于您在调试Rx代码时使用都是有用的,并且还允许您学习如何创建Rx运算符(这将是无副作用)。 https://github.com/LeeCampbell/RxCookbook/blob/34ac4f3536b00bbe259384d3bf0e8746da3311cc/Instrumentation/Logging.md
  2. 将您的方法链接起来,以便您实际获得所需的行为。
  3. 这里我们正确使用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方法之前的最后一个运算符。

    更多帮助: