Java 如何通过Android上的按钮正确地组合观察到的信息来发布推文?
有一个简单的问题-我对整个概念非常陌生:( 基本上,我有一些数据,我想通过按下按钮将其发布为tweet。如何正确组合观测值? 以下是片段:Java 如何通过Android上的按钮正确地组合观察到的信息来发布推文?,java,android,rx-java,observable,Java,Android,Rx Java,Observable,有一个简单的问题-我对整个概念非常陌生:( 基本上,我有一些数据,我想通过按下按钮将其发布为tweet。如何正确组合观测值? 以下是片段: _disposables.add( Observable.combineLatest( ObservableClickable.toObservable(_binding.btnPost), _model.getUrls(), _model.getImages(), _model.get
_disposables.add(
Observable.combineLatest(
ObservableClickable.toObservable(_binding.btnPost),
_model.getUrls(),
_model.getImages(),
_model.getHashtags(),
(click, urls, images, hashtags) -> {
Toast.makeText(_activity, "Posting tweet!", Toast.LENGTH_LONG).show();
return null;
})
.subscribe()
);
第一个是来自我按钮的事件,后一个是我想在tweet中包含的值
Toobbservable call:
@NonNull public static Observable<Object> toObservable(@NonNull View view)
{
return Observable.create(e -> view.setOnClickListener(v -> e.onNext(new Object())));
}
@NonNull public static Observable to Observable(@NonNull View)
{
返回Observable.create(e->view.setOnClickListener(v->e.onNext(newobject()));
}
我的可观察列表实施的一部分:
public class ObservableList <T> implements List<T>
{
private final List<T> _source;
private final PublishSubject<List<T>> _subject = PublishSubject.create();
public ObservableList(@NonNull List<T> source)
{
_source = source;
_subject.onNext(_source);
}
@NonNull public Observable<List<T>> getObservable() { return _subject; }
...
}
公共类ObservableList实现列表
{
私人最终名单(来源);;
private final PublishSubject _subject=PublishSubject.create();
公共ObservableList(@NonNull列表源)
{
_来源=来源;
_subject.onNext(_来源);
}
@非空的公共可观测getObservable(){return\u subject;}
...
}
提前感谢!
首先,model.get~~()必须返回Observable
和combineFunction
不应关联操作
您最好认为combineFunction
是map
的参数
这是我更改的代码
_disposables.add(
Observable.combineLatest(
ObservableClickable.toObservable(_binding.btnPost),
_model.getUrls(),
_model.getImages(),
_model.getHashtags(),
(click, urls, images, hashtags) -> new Post(urls, images, hashtags))
.subscribe(post => Toast.makeText(_activity, "Posting tweet!", Toast.LENGTH_LONG).show())
);
参考:
可观察列表
我认为可观察列表不是一个列表,而是列表中的项目
那么使用Observable.from(Iterable)
指
getObservable()
你最好避免把科目当作科目来传递
主题是双向的
因此,将subject作为可观察对象传递。使用subject.asObservable()
请参阅组合或合成观察值
- combine latest与您想要实现的目标并不完全相关,您想要做的是将可观察的事件组合在一起,以创建有意义的事件链(“流”)
- 在这种特殊情况下,您应该从点击
开始,并对每次点击做出反应,让我们假设每个模型方法(get__;)返回Observable(稍后我将讨论这一点),然后您希望将点击事件转换为获取模型数据的Observable
,以便使用Observable
,并创建一个flatMap()
来获取模型数据,因为您依赖于所有的模型数据,所以需要使用可观察对象
,它(像拉链一样…)将等待所有模型数据发出值,然后将它作为一个事件与所有压缩在一起的zip()
中的所有数据一起发出。可观察对象
有了这个新的Observable(表示点击时生成的tweet数据),您可能希望执行tweet发布,这可能是(?)对服务器的查询,因此您可以继续并在链中组成网络调用(通过另一个
如果您已经观察到有人执行网络请求,或者通过flatMap()
将获取tweet的组合数据并执行请求,总结如下:map()
ObservableClickable.toObservable(_binding.btnPost) .flatMap(aVoid -> Observable.zip( _model.getUrls(), _model.getImages(), _model.getHashtags(), (urls, images, hashTags) -> createTweetObject(urls, images,hashTags))) .map(tweet -> postTweet(tweet)) .subscribe();
- 这不是很清楚,但似乎您转换了每个模型
使用您的
成为可观察列表
的成员,您不应该这样做 除非以异步方式加载此数据,否则 似乎不是,根据您的可观察列表
可观察列表
实现, 在这种情况下,您已经准备好了内存中的数据,请记住,ReactiveX用于对事件和值集合作出反应 时间(异步)。
因此,如果我们回到上面的示例,只需将每次单击映射到tweet对象:ObservableClickable.toObservable(_binding.btnPost) .map(aVoid -> { Tweet tweet = createTweetObject(_model.getUrls(), _model.getImages(),_model.getHashtags()); return postTweet(tweet); }) .subscribe();
- 此外,在使用
主题之前,请检查是否有 操作符。可以创建
来发射内存中的对象 使用可观察的
,或Observable.just()
Observable.from()
- 为包装点击(或任何其他现有的异步api)创建
——应该谨慎,您可以阅读,也可以使用已经为Android中的许多UI元素创建的库Observable
ObservableClickable.toObservable(_binding.btnPost)
.map(aVoid -> {
Tweet tweet = createTweetObject(_model.getUrls(), _model.getImages(),_model.getHashtags());
return postTweet(tweet);
})
.subscribe();