RxAndroid间隔API调用。有更好的办法吗?
我每3秒调用一次天气API,并使用showWeather(“天气”)将结果附加到文本视图中,但我相信有更好的方法。我不确定为什么我需要创建类Func1,但确实需要,因为map需要它。还有没有办法缩短观察者的时间?不幸的是,我不使用lamda。有什么建议吗RxAndroid间隔API调用。有更好的办法吗?,android,rx-android,Android,Rx Android,我每3秒调用一次天气API,并使用showWeather(“天气”)将结果附加到文本视图中,但我相信有更好的方法。我不确定为什么我需要创建类Func1,但确实需要,因为map需要它。还有没有办法缩短观察者的时间?不幸的是,我不使用lamda。有什么建议吗 Observer myObserver = new Observer<String>() { @Override public void on
Observer myObserver = new Observer<String>() {
@Override
public void onError(Throwable e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
showWeather(value);
}
};
class Func1<T, T1> implements io.reactivex.functions.Function<Long, String > {
@Override
public String apply(Long aLong) throws Exception {
return getJSON("http://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b1b15e88fa797225412429c1c50c122a1",300);
}
}
Observable.interval(3, TimeUnit.SECONDS)
.map(new Func1<Long, Observable<String>>() {
}).observeOn(AndroidSchedulers.mainThread()).subscribe(myObserver);
Observer myObserver=new Observer(){
@凌驾
公共无效申报人(可丢弃的e){
Logger.getLogger(getClass().getName()).log(Level.SEVERE,null,e);
}
@凌驾
未完成的公共空间(){
}
@凌驾
认购的公共无效(一次性d){
}
@凌驾
public void onNext(字符串值){
展示天气(价值);
}
};
类Func1实现io.reactivex.functions.Function{
@凌驾
公共字符串apply(长时间)引发异常{
返回getJSON(“http://samples.openweathermap.org/data/2.5/weather?q=London,英国和appid=b1b15e88fa797225412429c1c50c122a1“,300);
}
}
可观测间隔(3,时间单位秒)
.map(新函数1(){
}).observeOn(AndroidSchedulers.mainThread()).subscribe(myObserver);
我试过:
Observable
.interval(3, SECONDS)
.subscribeOn(Schedulers.io())
.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return getJSON("http://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b1b15e88fa797225412429c1c50c122a1", 300);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(myObserver)
可观察
.间隔(3秒)
.subscribeOn(Schedulers.io())
.fromCallable(新的Callable(){
@凌驾
公共字符串调用()引发异常{
返回getJSON(“http://samples.openweathermap.org/data/2.5/weather?q=London,英国和appid=b1b15e88fa797225412429c1c50c122a1“,300);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(myObserver)
但我得到:
03-07 21:47:25.982 21181-21181/com.alex.rxandroidexamples E/imerExampleFragment$1$1:null
android.os.NetworkOnMainThreadException
在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
另外,如何取消onPause或onPause的订阅?我发现最好的方法是:
private final CompositeDisposable disposables = new CompositeDisposable();
Observable fetchWeatherInterval = Observable.interval(3, TimeUnit.SECONDS)
.map(new Function<Long, String>() {
@Override
public String apply(Long aLong) throws Exception {
return getWeather("http://samples.openweathermap.org/data/2.5/weather?", "London,uk", "b1b15e88fa797225412429c1c50c122a1");
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
Observer displayWeatherInterval = new Observer<String>() {
@Override
public void onError(Throwable e) {
Log.e("Throwable ERROR", e.getMessage());
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
disposables.add(d);
}
@Override
public void onNext(String value) {
textViewWeatherInterval.append(value);
}
};
buttonFetchIntervalWeather.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fetchWeatherInterval.subscribe(displayWeatherInterval);
}
});
private final CompositeDisposable disposables=新CompositeDisposable();
可观测的fetchWeatherInterval=可观测的间隔(3,时间单位秒)
.map(新函数(){
@凌驾
公共字符串apply(长时间)引发异常{
返回getWeather(“http://samples.openweathermap.org/data/2.5/weather?“,”英国伦敦“,”b1b15e88fa797225412429c1c50c122a1”);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
观察者displayWeatherInterval=新观察者(){
@凌驾
公共无效申报人(可丢弃的e){
Log.e(“可丢弃错误”,e.getMessage());
}
@凌驾
未完成的公共空间(){
}
@凌驾
认购的公共无效(一次性d){
添加(d);
}
@凌驾
public void onNext(字符串值){
textViewWeatherInterval.append(值);
}
};
buttonFetchIntervalWeather.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
fetchWeatherInterval.subscribe(displayWeatherInterval);
}
});
是什么让你说你认为有更好的方法?这是interval
的一个非常简单的用法。我使用Func1,因为在我看来,interval shots是双倍的,我需要类似map的东西来将字符串传递给observer。这似乎不方便。我尝试了Observable.interval(3,TimeUnit.SECONDS)当然你需要Func1
,interval的计数不是你感兴趣的项目。但您所拥有的正是使用map
将输入转换为新输出的预期模式。那么,你认为这有什么不理想的地方呢?我是RX的noobie,但你能看到编辑过的问题吗。我想知道这样的事情是否可能发生,但我得到了android.os.networkonMainThreadException如果网络调用发生错误怎么办?间隔是否仍在运行?否,它将切断流量。您可以在此处阅读更多内容: