将可观察对象插入到另一个可观察对象中

本文关键字:观察 对象 另一个 插入 | 更新日期: 2023-09-27 18:16:44

假设[伪]代码:

class MyActivity : Activity {
   Observable<string> mainObl
   void OnCreate(Bundle bundle) {
      mainObl = Observable.Never<string>();
   }

   Disposable subscription;
   void OnStart() {
      subscription = mainObl.Subscribe(UpdateUiOnEvent);
   }
   void OnStop() {
      subscription.Dispose();
   }

   // on click - start filling existing Observable with data from another source
   void OnButtonClick() {
      var tmpObl = Observale.just(1,2,3,4);
      mainObl.WhatMethodHere(tmpObl); // <<<<<<<<<<<< see Q
   }
}

广告问:
在上面的WhatMethodHere中使用哪种方法来钩住mainble中的tmpObl。
或者如何开始从另一个来源(另一个可观察对象)注入现有的可观察数据?

=== update ===
警告:Rx Android

我问这个作为开始RX用户
但是正确回答了初始问题

将可观察对象插入到另一个可观察对象中

要做到这一点,最简洁的方法是将所有内容保留在Observable空间中,而不是试图将事件和可观察代码混合在一起。假设您的按钮名为"button1",您可以使用以下[pseudo]代码实现:

class MyActivity : Activity {
   IDisposable subscription;
   void OnStart() {
      subscription = Observable
          // Adapt a delegate to the event signature and subscribe to the event (unsubscribing when subscription disposed)
          .FromEventPattern<EventHandler,EventArgs>(handler => (s,e) => handler(e), handler => button1.TouchUpInside += handler, handler => button1.TouchUpInside -= handler)               
          // Emit a new observable containing the data "from another source"
          .Select(args => Observable.Return("1", "2", "3", "4"))
          // Dispose any subscription to the previous observable and subscribe to the new observable emitted from above           
          .Switch()
          .Subscribe(UpdateUiOnEvent);
   }
   void OnStop() {
      subscription.Dispose();
   }
}

希望能有所帮助。

如果我想让你的代码保持和现在一样的结构,我会这样做:

class MyActivity
{
    private Subject<IObservable<string>> mainObl;
    private IDisposable subscription = null;
    public void OnCreate()
    {
        mainObl = new Subject<IObservable<string>>();
    }
    public void OnStart()
    {
        subscription = mainObl.Merge().Subscribe(x =>
        {
            Console.WriteLine(x);
        });
    }
    public void OnStop()
    {
        subscription.Dispose();
    }
    public void OnButtonClick()
    {
        var tmpObl = new [] { 1, 2, 3, 4 }
            .Select(x => x.ToString())
            .ToObservable();
        mainObl.OnNext(tmpObl);
    }
}

现在当你调用这个:

var ma = new MyActivity();
ma.OnCreate();
ma.OnStart();
ma.OnButtonClick();

…你得到这个:

<>之前123.4