I'm trying to upgrade to Retrofit 2.0 and add RxJava in my android project. I'm making an api call and want to retrieve the url and it with the response data in sqlite as a cache
Observable<MyResponseObject> apiCall(@Body body);
And in the RxJava call:
myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MyResponseObject myResponseObject) {
}
});
In Retrofit 1.9, we could get the url in the success callback:
@Override
public void success(MyResponseObject object, Response response) {
String url=response.getUrl();
//save object data and url to sqlite
}
How do you do this with Retrofit 2.0 using RxJava?
Rx gives you a very granular control over which threads will be used to perform work in various points within a stream. To point the contrast here already, basic call approach used in Retrofit is only scheduling work on its worker threads and forwarding the result back into the calling thread.
Update:
After reading the question again:
If you want access to the raw response you need to define your API interface as:
Observable<Response<MyResponseObject>> apiCall(@Body body);
instead of:
Observable<MyResponseObject> apiCall(@Body body);
You can get the Url using:
response.raw().request().url()
here:response
is the response from Retrofitraw
is the response from OkHttprequest
is the Request from OkHttp which contains the Url
as HttpUrl
.
Get response from API
using rxjava
use following code
Create class name API
public class Api {
private static final String BASE_URL="https://your_url";
private static Api instance;
private final IApiCall iApiCallInterface;
private Api() {
Gson gson = new GsonBuilder().setLenient().create();
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl(BASE_URL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson)).build();
iApiCallInterface = retrofit.create(IApiCall.class);
}
public static Api start() {
return instance = instance == null ? new Api() : instance;
}
public Observable<Example> getSendMoneyCountries() {
return iApiCallInterface.getCategoryList();
}
}
Crete Interface name IApiCall
here you can make your all othe API
requests
public interface IApiCall {
//response in in json array
@Headers("Content-Type: application/json")
@GET("/json")
Observable<Example> getCategoryList();
}
Write below code in your MainActivity.java
private static Api api;
api = Api.start();
api.getSendMoneyCountries()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<Example>() {
@Override
public void onNext(Example response) {
//Handle logic
try {
populateCountryList(response);
}catch (Exception e)
{
finish();
Toast.makeText(MainActivity.this,"Unable to send money",Toast.LENGTH_SHORT).show();
//MainActivity.showTimeoutDialog();
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
//Handle error
Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With