当前位置: 首页 > 知识库问答 >
问题:

Observable.from(需要在另一个线程上完成的事情)

裴昕
2023-03-14

我试过这样的事情:

create(new observable.onsubscribe>(){@override public void call(subscriber>subscriber){subscriber.onnext(getList());subscriber.oncompleted();}}).subscribe...

但是这个订阅在一个迭代上,onNext只传递完整的列表,而不是列表中的每个OIbject。我错过了什么?我该怎么做?谢谢

更新

以下是我正在尝试做的事情(以及如何使用toSortedList):

Observable.from(getList())
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .toSortedList(new Func2<Object, Object, Integer>() {
      @Override
      public Integer call(Object left, Object right) {
        if (left.equals(right))
          return 0;
        return left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
      }
    })
    .subscribe(new Observer<List<Object>>() {
//On next sends a List of objects I'm using
}

问题是需要在另一个线程上调用getList()(它返回的是可迭代的,而不是可观察的)。也许我没有正确使用你的第一个解决方案Dwursteisen。

我不明白为什么它不起作用:

Observable.just(0)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .flatMap(new Func1<Integer, Observable<Object>>() {
      @Override
      public Observable<Object> call(Integer integer) {
        return Observable.from(getList());
      }
    })
    .toSortedList(new Func2<Object, Object, Integer>() {
      @Override
      public Integer call(Object left, Object right) {
        if (left.equals(right))
          return 0;
        return left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
      }
    })
    .subscribe( ... )

或者用subscribe替换flatMap调用并在onNext中执行所有操作,它仍然在主线程上调用getList()...

共有1个答案

戚明朗
2023-03-14

如果要使用特定的线程,可以使用subscribeon方法指定要使用哪个“tread”(调度程序)。

sourceObservable.subscribeOn(httpScheduler)
                .flatMap(Observable::from)
                .subscribe();

如果它不起作用,您仍然可以使用您的解决方案。但只需在列表中迭代:

Observable.create(new Observable.OnSubscribe<CategorizedActivityInfoWrapper>() {
  @Override
  public void call(Subscriber<? super CategorizedActivityInfoWrapper> subscriber) {
     for(o : getList()) {
         subscriber.onNext(o);
     }

     subscriber.onCompleted();
  }
}).subscribe ...

更新

Observable.from(getList()).subscribe();
    List objs = getList();
    Observable.from(objs).subscribe();
 类似资料:
  • 目前,我使用的是firebase实时数据库。因此,我的数据更改来自另一个线程。因此,我无法控制何时更新新的数据。然后我如何知道何时调用以刷新UI? 谢谢

  • 我正在我的UI线程中调用一个方法。在这个方法中创建了一个新线程。我需要UI线程等待这个新线程完成,因为我需要这个线程的结果来继续UI线程中的方法。但我不想让UI在等待时冻结。有没有办法让UI线程在不忙的情况下等待?。

  • 我正在尝试通过将相关位分组到较小的 XML 中,将大量 XML 分解为更小、更易于维护的文件。例如,这是我的消息,其中包含100多个“消息”元素。 所以我的计划是做一些像- xi:include中的XML不是有效的XML,因为它们没有根元素。这可能吗? 当我对此应用模式验证时,我得到以下错误-“根元素之后的文档中的标记必须是格式良好的”。 作为测试,如果我只有一个< code > 我使用Docum

  • 我有一个使用模块的运行的进程: 其结果是: 这里,调用来处理图像(附件)并将OCR结果输出到myop。txt。 现在,我希望这在多个进程上发生,代表这个注释(或者直接看到这个),所以代码在这里: 这段代码所做的是调用4次,将流程对象保存在列表中,遍历所有这些对象,直到它们全部完成。下面给出了无限循环实现的说明。 这里的问题是后一个程序需要花费大量的时间来完成。它一直在使用函数等待进程完成,该函数为

  • 我有4条线。每个人每x秒打印给定的字母x次。任务是一次启动3个线程,在至少一个前一个线程完成时启动第四个线程。我不知道如何通知最后一个线程在适当的时间运行。

  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。