我正试图在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);
答案 0 :(得分:1)
Rx基于功能编程,其中一个关键租户是无副作用的编程。
创建var ole = Observable.Create...
时,您正在创建一个可观察的序列。当订阅它时,该序列将具有行为。
当您尝试设置订阅ole.SubscribeOn(NewThreadScheduler.Default);
时,您正在使用 SubscribeOn 行为装饰ole
可观察序列,但这是一个无副作用的操作,它返回一个新的可观察序列。您不会将返回的实例分配给任何内容。即ole.SubscribeOn(NewThreadScheduler.Default);
代码行无效。
然后返回原始未修改的ole
可观察序列并订阅该序列。
我有两个建议
Console.Write
噪音。这对于您在调试Rx代码时使用都是有用的,并且还允许您学习如何创建Rx运算符(这将是无副作用)。 https://github.com/LeeCampbell/RxCookbook/blob/34ac4f3536b00bbe259384d3bf0e8746da3311cc/Instrumentation/Logging.md 这里我们正确使用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
方法之前的最后一个运算符。
更多帮助: