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

RxJava 2/RxAndroid 2中使用“map”的问题

司空和悌
2023-03-14

我试图学习RXJAVA为Android。部分是有意义的,我仍然对许多其他部分感到困惑,但是,给我一些时间,我希望这一切会更有意义。

目前,我在“地图”功能方面遇到了问题。我收到一个错误,但不知道如何解决它。

在分享我的代码之前,我会解释我的理解。。简单地说。。可观察的——发出数据的代码。Observer——处理发出数据的代码。Map——接收A型数据并将其作为B型返回的代码。

所以,记住这一点:

在格拉德尔,我有:

compile 'io.reactivex.rxjava2:rxjava:2.0.1' 
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

如果我有:

    //declaration at top of file
    private Observable<Integer> myIntObservable;
    private Observer<Integer> myIntObserver;
    private Observer<String> myStringObserver;
    private Observable<String> myStringObservable;

    //usage in a function
    myIntObserver = new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Integer value) {
            Toast.makeText(getApplicationContext(), "" + value, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            Toast.makeText(getApplicationContext(), "Int Observer Async Complete", Toast.LENGTH_SHORT).show();
        }
    };


    //Connect my Observable to the observer.
    myIntObservable.observeOn(Schedulers.io());
    myIntObservable.subscribeOn(AndroidSchedulers.mainThread());
    myIntObservable.subscribe(myIntObserver);

这一切工作正常...我的地图使用是相似的...

我想做的是使用返回int的同一个observable,然后使用map代码返回字符串。。。

因此:

    myStringObservable
            .observeOn(Schedulers.io())
            .subscribeOn(AndroidSchedulers.mainThread())
            .map(new Function<Integer, String>() {
                @Override
                public String apply(Integer query){
                    return "String Observable result == " + query;
                }
            });

现在,我有两个问题:

a) 我收到的构建错误是:错误:(179,17)错误:类Observable中的方法映射不能应用于给定的类型;必需:找到函数:

我相信这基本上是在告诉我,这些类型不适合我的使用,但我不能清楚地看到。。。如何解决这个问题。

b) 我在上面发布的地图代码并没有将可观察的东西与它需要观察的东西联系起来。。。因此,我应该在map命令之前添加subscribe行吗?

因此,我尝试了这个。。

public void setupAsyncSubscription(){

    myIntObservable
            .observeOn(Schedulers.io())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe(myIntObserver)
            .map(new Function<Integer, String>() {
                @Override
                public String apply(Integer query){
                    return "String Observable result == " + query;
                }
            });

}

虽然这会删除“a”中详细说明的错误,但它会为我提供以下错误:

错误:(180,17)错误:无法取消对void的引用(这指向“map”调用)

最后,我还可以看到,我从“map”函数返回的内容根本没有被处理。。。我不清楚该怎么处理。我觉得我应该使用。在那种情况下订阅呼叫??

我“认为”我正在慢慢地走上解决问题的正确道路,但我还没有完全做到这一点,我不想在不了解问题是什么的情况下就试图找到答案。

和往常一样,我们非常感谢您的帮助。

共有2个答案

孙阳旭
2023-03-14

第一个问题是,myStringObservable发出classString的对象,但您试图映射需要classInteger参数的函数。为了实现你想要的,你应该使用MyInObservable

第二个问题是订阅调用为您返回一个Disposable对象,之后您不能执行map。删除那个订阅调用,这应该没问题。还请注意,您的方法签名告诉它返回String,但它不能返回String,它可以返回可观察

黄查猛
2023-03-14

你在这里有很多问题。有-一个接一个:

//Connect my Observable to the observer.
myIntObservable.observeOn(Schedulers.io());
myIntObservable.subscribeOn(AndroidSchedulers.mainThread());
myIntObservable.subscribe(myIntObserver);

上面的代码不会像你想象的那样工作。

操作员observeOnsubscribeOn的设计目的不是改变内部可观察状态。他们正在以期望的行为返回新的可观察对象。

要完成对io()线程的观察,并在main Thread()上订阅您的可观察,您需要更改代码:

//Connect my Observable to the observer.
myIntObservable = myIntObservable.observeOn(Schedulers.io());
myIntObservable = myIntObservable.subscribeOn(AndroidSchedulers.mainThread());
myIntObservable.subscribe(myIntObserver);

或使用(首选)链接:

//Connect my Observable to the observer.
myIntObservable
    .observeOn(Schedulers.io());
    .subscribeOn(AndroidSchedulers.mainThread());
    .subscribe(myIntObserver);

对于与您的代码相同的代码,在未更改的代码上调用。订阅()将导致在调用的同一个线程上订阅和观察。订阅()(最有可能来自主线程)。

记住,一旦工作完成,你就需要处理可观察到的东西。

当涉及到映射问题时-map()运算符更改了一种可观察的类型

如果您希望最终得到从整数对象转换而来的字符串对象,您需要使用原始的MyInObservable,作为数据源:

myStringObservable = myIntObservable
    (...)    
    .map(new Function<Integer, String>() {
        @Override
        public String apply(Integer query){
            return "String Observable result == " + query;
        }
    });

在上面的例子myInt观测将发出整数对象(如中预期的那样)。应用(整数查询)方法。然后. map()运算符将创建另一个类型为可观察的可观察的

然后,使用myStringObservable可以订阅其事件:

myStringObservable.subscribe(myStringObserver)

同样,请记住在工作完成时处理可观察的

还请注意,您应该:

  • 。observeOn()对于当前工作,请尽快执行

最后提示:考虑使用RXBADS与RXJava。使用所有这些匿名类(new Function()等)将使您的代码在不久的将来很难阅读。

 类似资料:
  • 由于我想使用RxJava2和RxAndroid2来尝试相同的解决方案,因此我尝试了以下方法。 然后ive创建了一个Singleton类,它有一个函数来修改/observ onec客户机订阅。 因为每次客户端订阅它时都会“召回”它,并且客户端一直保持连接,直到调用onCompleted()。 我很肯定这不是应该的,但是rxjava是为提供这样的解决方案而设计的吗?如果我想共享不同的事件,那么onNe

  • 在RXJava1中,有CompositeSubscription,但在RxJava2中没有,在RxJava2中有CompositeDisable。我如何在RXJava2中使用CompositeDisposable或Disposable?

  • 我发现RxJava存在一些问题(我想尝试RXJava2,这里我看到了RXJava1和RXJava2)。在添加了所有依赖项之后,问题就出现了,我们没有在主应用程序中使用。 更新:正如我在下面提到的,我检查了三个主题(你可以在下面看到)。这个问题:可能的重复类似于我已经在下面提到的一个:这个。这两种方法都没有考虑到我在回答中强调的真正问题。答案是“从Registfit2到RXJava2目前还没有生产就

  • 我正在android中学习RxJava2。谁能解释一下,我们如何使用RxJava2将数据插入SQLiteDatabase。这里是我试图使用的代码示例,但它将数据插入数据库六次; //OnClick(单击) //可观察 //观察员 //添加方法

  • 我有一个自定义对象列表(

  • 我试图通过在索引中添加标签名来在映射上迭代时生成唯一键。 请查找下面的代码片段。 当我尝试重复添加项目时,出现以下错误。 警告:遇到两个具有相同密钥的子项,。键应该是唯一的,以便组件在更新期间保持其标识。非唯一键可能会导致复制和/或忽略子项-不支持该行为,并且可能在将来的版本中更改。在burgers(由burgers创建)中的div(由BurgerBuilder创建)中的Aux(由BurgerBu