Every thing is working fine I am facing below error when my app goes to onPause
state and then to onResume
and when I call any API I get below error.
HTTP FAILED: java.io.IOException: Canceled
I am using RxJava and Retrofit to do all my network operations. Below is my setup.
ApplicationComponent.java
@ApplicationScope
@Component(modules = {ContextModule.class, NetworkModule.class})
public interface ApplicationComponent {
void inject(MyApplication myApplication);
}
ApplicationScope.java
@Scope
@Retention(RetentionPolicy.CLASS)
public @interface ApplicationScope {
}
ContextModule.java
@Module
public class ContextModule {
private Context context;
public ContextModule(Context context){
this.context = context;
}
@Provides
@ApplicationScope
public Context applicationContext(){
return context.getApplicationContext();
}
}
NetworkModule.java
@Module @ApplicationScope
public class NetworkModule {
private final String BASE_CONTACT_URL = "";
@Provides @ApplicationScope
public PoolAPIService getPoolApiService(Retrofit retrofit){
APIServiceapiServicece = retrofit.create(APIService.class);
return apiServicece;
}
@Provides @ApplicationScope
public Retrofit getRetrofit(OkHttpClient okHttpClient){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_CONTACT_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
}
@Provides @ApplicationScope
public OkHttpClient getOkHttpClient(HttpLoggingInterceptor interceptor, Cache cache){
OkHttpClient okhttpclient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.cache(cache)
.build();
return okhttpclient;
}
@Provides @ApplicationScope
public HttpLoggingInterceptor getInterceptor(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.d("Log", message);
}
});
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
return interceptor;
}
@Provides @ApplicationScope
public Cache getCache(File cacheFile){
Cache cache = new Cache(cacheFile, 10*1024*1024); //10MB size
return cache;
}
@Provides @ApplicationScope
public File getCacheFile(Context context){
File cacheFile = new File(context.getCacheDir(), "cache");
cacheFile.mkdirs();
return cacheFile;
}
@Provides @ApplicationScope
public Picasso getPicasso(Context context, OkHttpClient okHttpClient){
Picasso picasso = new Picasso.Builder(context)
.downloader(new OkHttp3Downloader(okHttpClient))
.build();
return picasso;
}
}
I am injecting it in my Application class.
MyApplication.java
public class MyApplication extends Application {
ApplicationComponent applicationComponent;
@Inject
APIService apiService;
@Override
public void onCreate() {
super.onCreate();
applicationComponent = DaggerApplicationComponent.builder()
.contextModule(new ContextModule(this))
.build();
applicationComponent.inject(this);
}
public APIService getAPIService(){
return apiService;
}
}
And this is how I am calling the API Service.
LoginActivity.java
//creating LoginService instance
LoginService loginService = new LoginService(((MyApplication)getApplication()).getAPIService());
.......
void login() {
final String mobileNumber = view.getMobileNumber();
final String password = view.getPassword();
Subscriber<LoginResponse> subscriber = new Subscriber<LoginResponse>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
if(subscriptionLogin != null && !subscriptionLogin.isUnsubscribed()){
subscriptionLogin.unsubscribe();
}
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "error: " + e.getMessage());
}
@Override
public void onNext(LoginResponse loginResponse) {
Log.d(TAG, loginResponse.message);
}
};
LoginRequest request = new LoginRequest();
request.mobileNumber = mobileNumber;
request.password = password;
subscriptionLogin = service.login(subscriber, request);
compositeSubscription.add(subscriptionLogin);
....
void onDestroy() {
//unsubscribe all the subscription
compositeSubscription.unsubscribe();
}
Logcat
--> POST http://.../.. http/1.1
Content-Type: application/json; charset=UTF-8
Content-Length: 32
--> END POST (32-byte body)
<-- HTTP FAILED: java.io.IOException: Canceled
I've logged onStart
, onResume
, onPause
and onStop
. Here's the output when activity enters multi-window mode:
I bet you haven't expected that after onResume
immediately onPause
will be called. And, as long as you are creating a subscription in onResume
it is reasonable for you to unsubscribe in onPause
, which happens immediately.
HTTP FAILED: java.io.IOException: Canceled
This means, that you have unsubscribed from your subscription (i.e. your retrofit call is cancelled).