2017-04-03 114 views
0

每一件事情都正常工作当我的应用程序进入状态,然后到onResume,并且当我调用任何API时,我会遇到错误。HTTP失败:java.io.IOException:在多窗口模式下取消

HTTP失败: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; 
    } 

} 

我在我的Application类中注入它。

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

请发布完整的错误stacktrace –

+0

你在做什么onPause()和onResume()? – yosriz

回答

1

我登录onStartonResume,和onStop。下面是输出活动时进入多窗口模式:

enter image description here

我敢打赌,你有没有预期后onResume立即将被调用。而且,只要您在onResume中创建订阅,您立即在处取消订阅是合理的。

HTTP失败:java.io.IOException异常:取消

这意味着,你必须从你的订阅退订(即你的改装呼叫被取消)。

+0

还有onStop中的compositeSubscription.unsubscribe()。谢谢你让我看着正确的方向。 – ik024

+1

@ ik024,欢迎光临。意想不到的行为,至少对我而言。 – azizbekian

相关问题