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

从单个<list>可观察对象获取列表

公羊奇
2023-03-14

我有一个方法返回<code>Single

private fun getListOfDownload(): ArrayList<HistoryItem> {
    val downloads = manager.lastHundredVisitedHistoryItems()
    downloads.subscribe { t ->
        return t; // not allowed
    }
}

我可以使用订阅,但这不允许我从中返回列表。

我还尝试了映射

downloads.map { t: List<HistoryItem> -> return t } // again `return t` is not allowed.

编辑

我可以通过以下方式完成这项工作:

private fun getListOfDownload(): ArrayList<HistoryItem> {
        var list = ArrayList<HistoryItem>()
        val downloads = manager.lastHundredVisitedHistoryItems()
        downloads.subscribe { t ->
            list = t as ArrayList<HistoryItem>
        }
        return list
    }

请告诉

  • 如果这种方式是正确的

我是反应式编程新手,请解释一下。

共有3个答案

曾航
2023-03-14

您可以使用subscribe获取列表,如下所示:

 @NonNull
public Single<String> getHistoryPage() {
    return Single.create(new SingleAction<String>() {
        @Override
        public void onSubscribe(@NonNull final SingleSubscriber<String> subscriber) {


            mHistoryModel.lastHundredVisitedHistoryItems()
                    .subscribe(new SingleOnSubscribe<List<HistoryItem>>() {
                        @Override
                        public void onItem(@Nullable List<HistoryItem> item) {
                      final StringBuilder historyBuilder = new StringBuilder(HEADING_1 + mTitle + HEADING_2);      

                            Iterator<HistoryItem> it = item.iterator();
                            HistoryItem helper;
                            while (it.hasNext()) {
                                helper = it.next();
                                historyBuilder.append(PART1);
                                historyBuilder.append(helper.getUrl());
                                historyBuilder.append(PART2);
                                historyBuilder.append(helper.getTitle());
                                historyBuilder.append(PART3);
                                String url = helper.getUrl();
                                try {
                                    URL url1 = new URL(url);
                                    authority = url1.getAuthority();
                                } catch (MalformedURLException e) {
                                    e.printStackTrace();
                                }
                                historyBuilder.append(authority);   //No need of path showing of History file.
                                historyBuilder.append(PART4);
                            }

                            historyBuilder.append(END);
                            File historyWebPage = getHistoryPageFile(mApp);
                            FileWriter historyWriter = null;
                            try {
                                //noinspection IOResourceOpenedButNotSafelyClosed
                                historyWriter = new FileWriter(historyWebPage, false);
                                historyWriter.write(historyBuilder.toString());
                            } catch (IOException e) {
                                Log.e(TAG, "Unable to write history page to disk", e);
                            } finally {
                                Utils.close(historyWriter);
                            }

                            subscriber.onItem(Constants.FILE + historyWebPage);
                            subscriber.onComplete();
                        }
                    });
        }
    });
}

通过使用上面的代码,你可以在html页面中获得历史列表。为此,您必须使用StringBuilder,然后才能获得完整的历史页面

仉姚石
2023-03-14

我认为订阅lambda是交叉的,这意味着它不允许本地返回

您通常在这里要做的是在订阅{}中使用列表来实现其目的(更新回收器视图)

例如:

val compositeDisposable = CompositeDisposable()

private fun downloadList() {
    manager.lastHundredVisitedHistoryItems()
        downloads.subscribe { downloadedList ->
            this.list = downloadedList
            // or
            adapter.updateDataSet(downloadedList)
        }.addTo(compositeDisposeable)
    }
}

您还需要将您的一次性添加到CompositeDisposable以防止内存韭菜的可能性

侯和惬
2023-03-14

在您的代码中,< code>getListOfDownload返回< code>ArrayList

这就是为什么您不能返回订阅块中的项目,因为该块是lamda,它将遵守ArrayList

但如果你不在乎观察结果你可以这样做,

private fun getListOfDownload(): ArrayList<HistoryItem> {
    val downloads = manager.lastHundredVisitedHistoryItems()
    return downloads.blockingGet()
}

但是当我们应用< code>blockingGet()时,您将失去对< code > lastpositedhistoryitems 的异步调用,但是由于您没有在单独的线程上观察到它,我假设您想在主线程上调用它。

但是如果您想观察< code > lastpositedhistoryitems(),那么您可以将该方法作为参数传递,该参数将充当< code>ArrayList的消费者

private fun getListOfDownload( listener : (ArrayList<LoginViewModel.HistoryItem>) -> Unit) {
        val downloads = manager.lastHundredVisitedHistoryItems()
        downloads.subscribe { t -> listener.invoke(t) }
}

// when you call above method look like below
// here variable `it` is nothing but a object of ArrayList<LoginViewModel.HistoryItem>
getListOfDownload { adapter.updateDataSet(it) }
 类似资料:
  • 如何编写接受并返回的函数? 我得到的错误是类型'Observable'不能分配到类型'Observable'。类型'transaction[]不可分配给类型'transaction'。类型“transaction[]”中缺少属性“id”。 据我所知,可观测管道函数(map、single、find、max等)与数据流有关(即,当可观测器随着时间的推移发出多个项时),当可观测器同时发出单个项(碰巧是一

  • 我对RxJS很陌生,所以如果这个问题已经得到回答,我提前道歉。 我有一个Angular 2应用程序,在其中一个组件中有一个普通对象。我将UI绑定到这个对象。我想做的是能够捕获对这个对象的所有更改,无论它们来自代码还是来自用户更改其中一个字段。 我正在查看可观察对象,但似乎只有通过Emit方法推送新对象时,订阅者才能接收通知。例如,在属性绑定到输入字段的情况下,这将如何工作? 有更好的方法吗? 这是

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio

  • 这个问题看起来很长,但应该是一个很基础的rxjs问题。如果可以的话请帮忙。 我正在编写一个 Angular 7 应用程序,其中包含如下服务、组件和模板,我想以一种简单的方式访问可观察量的最后一个值。 SoundMeter服务 在服务中,我有一个私有的行为主体,我用它来使用“下一步”发出值。我使用. as观察()将此行为主体暴露给消费者,以防止消费者执行. Next()并发出新值。在服务中,我使用.