Java 如何通过Android上的按钮正确地组合观察到的信息来发布推文?

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

有一个简单的问题-我对整个概念非常陌生:( 基本上,我有一些数据,我想通过按下按钮将其发布为tweet。如何正确组合观测值? 以下是片段:

_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与您想要实现的目标并不完全相关,您想要做的是将可观察的事件组合在一起,以创建有意义的事件链(“流”)

  • 在这种特殊情况下,您应该从点击
    Observable
    开始,并对每次点击做出反应,让我们假设每个模型方法(get__;)返回Observable(稍后我将讨论这一点),然后您希望将点击事件转换为获取模型数据的
    Observable
    ,以便使用
    flatMap()
    ,并创建一个
    可观察对象
    来获取模型数据,因为您依赖于所有的模型数据,所以需要使用
    zip()
    ,它(像拉链一样…)将等待所有模型数据发出值,然后将它作为一个事件与所有压缩在一起的
    可观察对象
    中的所有数据一起发出。
    有了这个新的Observable(表示点击时生成的tweet数据),您可能希望执行tweet发布,这可能是(?)对服务器的查询,因此您可以继续并在链中组成网络调用(通过另一个
    flatMap()
    如果您已经观察到有人执行网络请求,或者通过
    map()
    将获取tweet的组合数据并执行请求,总结如下:

    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)创建
    Observable
    ——应该谨慎,您可以阅读,也可以使用已经为Android中的许多UI元素创建的库
model.get~~()是否返回可观察的对象?
 ObservableClickable.toObservable(_binding.btnPost)
        .map(aVoid -> {
            Tweet tweet = createTweetObject(_model.getUrls(),     _model.getImages(),_model.getHashtags());
            return postTweet(tweet);
        })
        .subscribe();