gpt4 book ai didi

android - HTTP FAILED : java. io.IOException: 在多窗口模式下取消

转载 作者:搜寻专家 更新时间:2023-11-01 09:35:57 26 4
gpt4 key购买 nike

一切正常 当我的应用程序进入 onPause 状态然后进入 onResume 并且当我调用任何 API 时我遇到以下错误。

HTTP FAILED: java.io.IOException: Canceled

我正在使用 RxJava 和 Retrofit 来完成我所有的网络操作。以下是我的设置。

应用组件.java

@ApplicationScope
@Component(modules = {ContextModule.class, NetworkModule.class})
public interface ApplicationComponent {
void inject(MyApplication myApplication);
}

应用程序范围.java

@Scope
@Retention(RetentionPolicy.CLASS)
public @interface ApplicationScope {
}

上下文模块.java

@Module
public class ContextModule {

private Context context;

public ContextModule(Context context){
this.context = context;
}

@Provides
@ApplicationScope
public Context applicationContext(){
return context.getApplicationContext();
}

}

网络模块.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;
}

}

我正在将它注入(inject)到我的应用程序类中。

我的应用程序.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 服务的方式。

登录 Activity .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();
}

日志

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

最佳答案

我已经记录了 onStartonResumeonPauseonStop。这是 Activity 进入多窗口模式时的输出:

enter image description here

我敢打赌,您没有预料到 onResume 之后会立即调用 onPause。而且,只要您在 onResume 中创建订阅,您就可以在 onPause 中取消订阅,这会立即发生。

HTTP FAILED: java.io.IOException: Canceled

这意味着,您已取消订阅(即您的 retrofit 电话已取消)。

关于android - HTTP FAILED : java. io.IOException: 在多窗口模式下取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43177425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com