2017-04-03 16 views
0

すべてのことがうまく動作していますアプリケーションが状態になり、次にonResumeになり、APIを呼び出すとエラーが発生します。HTTPが失敗しました:java.io.IOException:マルチウィンドウモードでキャンセルされました

HTTP FAILED:にjava.io.IOException:私はRxJavaを使用し、すべての私のネットワーク運用を行うためにレトロフィットしています

をキャンセル。以下は私のセットアップです。

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

} 

私はそれを私のアプリケーションクラスに注入しています。

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

} 

そして、私はAPIサービスを呼び出していますどのようにこれはあります。

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 
+0

あなたは 'compositeSubscription'で何をしていますか? – azizbekian

+0

完全なエラースタックトレースを投稿してください –

+0

onPause()とonResume()で何をやっていますか? – yosriz

答えて

1

私はonStartonResume、とonStopを記録しました。活動はマルチウィンドウモードに入るとき出力は次のとおりです。

enter image description here

私はあなたがonResume直後が呼び出されることを期待していない賭け。 onResumeで定期購読を作成している限り、で購読を解除することは合理的です。これはただちに発生します。

HTTP FAILED:にjava.io.IOException:

このキャンセルは、あなたのサブスクリプションから退会していることを、意味(すなわち、あなたの改装コールがキャンセルされます)。

+0

onStopにはcompositeSubscription.unsubscribe()もありました。正しい方向に見せてくれてありがとう。 – ik024

+1

@ ik024よろしくお願いいたします。少なくとも私にとっては予期しない動作。 – azizbekian

関連する問題