我有一个方法返回<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
}
请告诉
我是反应式编程新手,请解释一下。
您可以使用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,然后才能获得完整的历史页面
我认为订阅lambda是交叉的,
这意味着它不允许本地返回
您通常在这里要做的是在订阅{}
中使用列表来实现其目的(更新回收器视图)
例如:
val compositeDisposable = CompositeDisposable()
private fun downloadList() {
manager.lastHundredVisitedHistoryItems()
downloads.subscribe { downloadedList ->
this.list = downloadedList
// or
adapter.updateDataSet(downloadedList)
}.addTo(compositeDisposeable)
}
}
您还需要将您的一次性添加到CompositeDisposable
以防止内存韭菜的可能性
在您的代码中,< 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()并发出新值。在服务中,我使用.