【发布时间】:2017-05-17 08:41:53
【问题描述】:
我正在尝试学习适用于 Android 的 RXJAVA。部分是有意义的,我仍然对很多其他部分感到困惑,但是,有一段时间我希望这一切都会变得更有意义。
目前我在使用“地图”功能时遇到问题。我收到一个错误,但不知道如何解决它。
在分享我的代码之前,我先解释一下我的理解。 在一个简单的水平.. Observable - 发出数据的代码。 观察者 - 处理发出的数据的代码。 Map - 接收类型 A 的数据并将其返回已处理或作为类型 B 的代码。
所以,考虑到这一点:
在 gradle 中我有:
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);
这一切都很好......我的地图用法类似......
我想做的是使用同样的 observable 返回一个 int,然后使用映射代码来代替返回一个字符串...
因此:
myStringObservable
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.map(new Function<Integer, String>() {
@Override
public String apply(Integer query){
return "String Observable result == " + query;
}
});
现在,我有两个问题:
a) 我收到的构建错误是: Error:(179, 17) 错误:Observable 类中的方法映射不能应用于给定类型; 必需:功能 发现:> 原因:无法推断类型变量 R (参数不匹配;> 不能转换为函数) 其中 R,T 是类型变量: R 扩展了在方法 map(Function) 中声明的 Object T 扩展了 Observable 类中声明的 Object
我相信这本质上是在告诉我这些类型不适合我的用法,但是我看不清楚...如何解决这个问题。
b) 我在上面发布的地图代码没有将可观察对象连接到它需要观察的内容......因此,我应该在地图命令之前添加订阅行吗?
因此,我尝试了这个..
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”中详述的错误,但它却给我提供了以下错误:
Error:(180, 17) error: void 不能被取消引用(这指向 'map' 调用)
最后,我还可以看到,我从“地图”函数“返回”的内容根本没有被处理……我不清楚如何处理。我觉得在这种情况下我应该使用 .subscribe 调用??
我“认为”我正在慢慢解决问题.
一如既往,感谢您的帮助。
【问题讨论】:
标签: java android rx-java reactive-programming rx-android