RxAndroid间隔API调用。有更好的办法吗?

RxAndroid间隔API调用。有更好的办法吗?,android,rx-android,Android,Rx Android,我每3秒调用一次天气API,并使用showWeather(“天气”)将结果附加到文本视图中,但我相信有更好的方法。我不确定为什么我需要创建类Func1,但确实需要,因为map需要它。还有没有办法缩短观察者的时间?不幸的是,我不使用lamda。有什么建议吗 Observer myObserver = new Observer<String>() { @Override public void on

我每3秒调用一次天气API,并使用showWeather(“天气”)将结果附加到文本视图中,但我相信有更好的方法。我不确定为什么我需要创建类Func1,但确实需要,因为map需要它。还有没有办法缩短观察者的时间?不幸的是,我不使用lamda。有什么建议吗

            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如果网络调用发生错误怎么办?间隔是否仍在运行?否,它将切断流量。您可以在此处阅读更多内容: