2015-07-19 30 views
0

我是rx java的新手,所以你可以幫忙。我有簡單的改造實施,我用它來獲取有關無線電的數據。我需要每10秒獲取一次這些數據。我知道這樣做的唯一方法是使用ServiceManager和AlarmManager,但我不喜歡它。我如何使用rx java來做到這一點?我可以每10秒獲取一次數據嗎? 這裏是改造實現的代碼RX Java android for retrofit

public class ApiProvider { 
    public static final String PRODUCTION_API_URL = "http://radio.somesite.org"; 
    static final int DISK_CACHE_SIZE = (int) MEGABYTES.toBytes(50); 
    private static ApiProvider instance; 
    private Application application; 

    private ApiProvider() { 
     this.application = CApplication.getApplication(); 
    } 

    public static ApiProvider getInstance() { 
     if (instance != null) 
      return instance; 
     else { 
      instance = new ApiProvider(); 
      return instance; 
     } 

    } 

    public static OkHttpClient createOkHttpClient(Application app) { 
     OkHttpClient client = new OkHttpClient(); 
     client.setConnectTimeout(10, SECONDS); 
     client.setReadTimeout(10, SECONDS); 
     client.setWriteTimeout(10, SECONDS); 

     // Install an HTTP cache in the application cache directory. 
     File cacheDir = new File(app.getCacheDir(), "http"); 
     Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE); 
     client.setCache(cache); 

     return client; 
    } 

    private RestAdapter getRestAdapter() { 
     Gson gson = new GsonBuilder() 
       .registerTypeAdapter(DateTime.class, new DateTimeConverter()) 
       .create(); 
     OkHttpClient client = createOkHttpClient(application); 

     Endpoint endpoint = Endpoints.newFixedEndpoint(PRODUCTION_API_URL); 

     return new RestAdapter.Builder() // 
       .setClient(new OkClient(client)) // 
       .setEndpoint(endpoint) // 
       .setConverter(new GsonConverter(gson)) // 
       .build(); 
    } 



    private RadioLiveInfoService getRadioInfo() { 
     return getRestAdapter().create(RadioLiveInfoService.class); 
    } 

    private RadioWeekInfoService getRadioWeek() { 
     return getRestAdapter().create(RadioWeekInfoService.class); 
    } 

    public void getRadioInfo(Type type, final CallbackInfoListener listener) { 
     Callback callback = new Callback() { 
      @Override 
      public void success(Object o, Response response) { 
       try { 
        LiveInfo liveInfo = (LiveInfo) o; 
        listener.dataLoaded(liveInfo, true); 
        Log.d("Success", response.toString()); 
       } catch (ClassCastException ex) { 
        ex.printStackTrace(); 
       } 
      } 

      @Override 
      public void failure(RetrofitError retrofitError) { 
       listener.dataLoaded(new LiveInfo(), false); 
       Log.e("Error", retrofitError.toString()); 
      } 
     }; 

     getRadioInfo().commits(type, callback); 
    } 

    public void getRadioWeekInfo(final CallbackWeekListener listener) { 
     Callback callback = new Callback() { 
      @Override 
      public void success(Object o, Response response) { 
       try { 
        WeekInfo weekInfo = (WeekInfo) o; 
        listener.dataLoaded(weekInfo, true); 
        Log.d("Success", response.toString()); 
       } catch (ClassCastException ex) { 
        ex.printStackTrace(); 
       } 
      } 

      @Override 
      public void failure(RetrofitError retrofitError) { 
       listener.dataLoaded(new WeekInfo(), false); 
       Log.e("Error", retrofitError.toString()); 
      } 
     }; 

     getRadioWeek().commits(callback); 
    } 

} 

在此先感謝

+1

如果你想使用RxJava爲什麼你不使用Retrofit的'Observable ' API?然後你可以使用'interval'或'timer'(我忘記了它是哪個算子)和ta-dah。無論如何,這就是路線,但我從未去過那裏,只看到了路牌。 – EpicPandaForce

+0

好的。我會盡力。我不知道什麼是可觀察的。它是一種模式還是什麼?這就像你可以調用方法,什麼時候它會完成獲取Observable 的數據會動態改變? –

+1

看看這裏,它確實是你所描述的:http://codereview.stackexchange.com/questions/84304/using-a-subject-to-trigger-a-music-list-to-reload。另外,請在http://square.github.io/retrofit/ –

回答

0

我做了這樣的工作方式。我仍然需要了解如何使用合成訂閱來完成它。

RadioLiveInfoObservableService radioLiveInfoObservableService=ApiProvider.getInstance().getRadioObserverInfo(); 
radioLiveInfoObservableService.commits(Type.INTERVAL) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnError(trendingError) 
     .onErrorResumeNext(Observable.<LiveInfo>empty()).subscribe(new Action1<LiveInfo>() { 
    @Override 
    public void call(LiveInfo liveInfo) { 
     List<Current> currents=new ArrayList<Current>(); 
     currents.add(liveInfo.getCurrent()); 
     adapter.currentShows=currents; 
     adapter.notifyDataSetChanged(); 
     rv.setAdapter(adapter); 
    } 
});