Jenya Kirmiza
Jenya Kirmiza

Reputation: 711

RX Java android for retrofit

I'm new to rx java, so can you help with it. I have simple retrofit implementation and i'm using it to get data about radio. I need to get this data every 10 seconds. The only way i know to do it is using Service with AlarmManager, but i don't like it. How can i do it using rx java? Can i get data every 10 seconds. Here is the code of retrofit implementation

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

}

Thanks in advance

Upvotes: 0

Views: 914

Answers (2)

taman neupane
taman neupane

Reputation: 938

I am using it this way

fun getEventDetails(eventId: Long) : MutableLiveData<Response> {
    Log.d("Retrofit", "Get event detail")
    compositeDisposable.add(useCase.getEvents()
            .repeatWhen {
                return@repeatWhen it.delay(10, TimeUnit.SECONDS) //Repeat every 10 seconds
            }
            .repeatUntil {
                return@repeatUntil repeat //Boolean
            }
            .map(this::parseResponse)
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(AndroidSchedulers.mainThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                dashboardResponse.postValue(Response().success(it))
            }, {
                Timber.d(it.message)
                dashboardResponse.postValue(Response().error(it.getRetrofitErrorMessage()))
            })
    )

    return dashboardResponse

}

And API Method is :

 @GET("events")
fun getEvents(): Observable<String>

Upvotes: 1

Jenya Kirmiza
Jenya Kirmiza

Reputation: 711

I made it to work this way. Still i need to understand how to do it with composit subscription.

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

Upvotes: 1

Related Questions