2017-03-07 90 views
0

我正在每3秒做一次天气API调用,并将结果附加到使用showWeather(“天气”)的textView中,但我相信有更好的方法来做到这一点。我不知道为什么我需要创建Class Func1,但是因为地图需要它。还有一种方法可以缩短观察者吗?不幸的是我不使用lamda。有什么建议么?RxAndroid间隔API调用。有没有更好的办法?

  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); 

我想:

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) 

,但我得到:

03-07 21:47:25.982 21181-21181/com.alex.rxandroidexamples E/imerExampleFragment $ 1 $ 1:空 android.os.NetworkOnMainThreadException at android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)

另外如何取消订阅onPause或onPause?

+0

是什么让你说你想有更好的办法吗?这是'interval'的一个非常直接的用法。 –

+0

上午使用Func1因为我看到它间隔拍摄双打,我需要像地图传递观察员的字符串。这看起来不方便。我试过Observable.interval(3,TimeUnit.SECONDS) –

+0

当然你需要'Func1',来自间隔的计数不是感兴趣的项目。但是你所拥有的恰恰是使用'map'将输入转换为新输出的预期模式。再说一次,你认为对此不理想吗? –

回答

0

我发现做到这一点的最好办法是:

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); 
     } 
    }); 
相关问题