J'essaie de PUBLIER demander au serveur de récupérer des données, mais parfois cela se produit SocketTimeoutException
!
J'ai utilisé Ok3Client
pour le résoudre mais je suis confronté à la même exception Comment puis-je le résoudre?
Mon code est ci-dessous
public void getNormalLogin() {
if (mProgressDialog == null) {
mProgressDialog = ViewUtils.createProgressDialog(mActivity);
mProgressDialog.show();
} else {
mProgressDialog.show();
}
if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
restadapter = new RestAdapter.Builder().setEndpoint(Host).setLogLevel(RestAdapter.LogLevel.FULL).setClient(new Ok3Client(new OkHttpClient())).build();
mApi = restadapter.create(Api.class);
mApi.SignIn(etEmail.getText().toString(), etPassword.getText().toString(), new Callback<ArrayList<SignUpMainBean>>() {
@Override
public void success(ArrayList<SignUpMainBean> signUpMainBeen, Response response) {
mProgressDialog.dismiss();
LOGD("Status:: ::", String.valueOf(response.getStatus()));
LOGD("Code:: ::", String.valueOf(signUpMainBeen.get(0).getCode()));
if (signUpMainBeen != null && signUpMainBeen.size() > 0) {
if (signUpMainBeen.get(0).getCode() == 1) {
for (int i = 0; i < signUpMainBeen.size(); i++) {
for (int j = 0; j < signUpMainBeen.get(i).getResult().size(); j++) {
showToast(mActivity, getString(R.string.you_have_successfully_login), Toast.LENGTH_SHORT);
LOGD("Success", "Success");
finish();
SignIn.mActivity.finish();
}
}
} else if (signUpMainBeen.get(0).getCode() == 0) {
mProgressDialog.dismiss();
showToast(mActivity, getString(R.string.invalid_email_password), Toast.LENGTH_SHORT);
LOGD("Invalid email or password", "Invalid email or password");
} else if (signUpMainBeen.get(0).getCode() == -1) {
mProgressDialog.dismiss();
showToast(mActivity, getString(R.string.your_account_is_inactive), Toast.LENGTH_SHORT);
LOGD("Your account is inactive", "Your account is inactive");
}
}
}
@Override
public void failure(RetrofitError error) {
mProgressDialog.dismiss();
showToast(mActivity, getString(R.string.can_not_connect_to_server), Toast.LENGTH_SHORT);
LOGD("Failure", "Failure");
}
});
}
}
Mon journal des erreurs est
D/Retrofit: Java.net.SocketTimeoutException
at Java.net.PlainSocketImpl.read(PlainSocketImpl.Java:532)
at Java.net.PlainSocketImpl.access$000(PlainSocketImpl.Java:40)
at Java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.Java:255)
at okio.Okio$2.read(Okio.Java:139)
at okio.AsyncTimeout$2.read(AsyncTimeout.Java:211)
at okio.RealBufferedSource.indexOf(RealBufferedSource.Java:306)
at okio.RealBufferedSource.indexOf(RealBufferedSource.Java:300)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.Java:196)
at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.Java:185)
at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.Java:126)
at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.Java:723)
at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.Java:81)
at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.Java:708)
at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.Java:563)
at okhttp3.RealCall.getResponse(RealCall.Java:241)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.Java:198)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.Java:160)
at okhttp3.RealCall.execute(RealCall.Java:57)
at com.jakewharton.retrofit.Ok3Client.execute(Ok3Client.Java:40)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.Java:326)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.Java:220)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.Java:278)
at retrofit.CallbackRunnable.run(CallbackRunnable.Java:42)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
at retrofit.Platform$Android$2$1.run(Platform.Java:142)
at Java.lang.Thread.run(Thread.Java:818)
Augmenter le temps si la récupération prend plus de temps utiliser ce code cela a fonctionné pour moi
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(100, TimeUnit.SECONDS)
.readTimeout(100,TimeUnit.SECONDS).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("yourbaseurl").client(client)
.addConverterFactory(GsonConverterFactory.create(new Gson())).build();
hay c’est un travail qui n’est pas une bonne pratique, mais qui a été commenté vers le bas, le système d’arrière-plan ne devrait pas durer aussi longtemps et l’utilisateur doit être averti en cas d’erreur ou réessayer message
La prévention de SocketTimeoutException
dépasse nos limites ... Un moyen de la gérer efficacement consiste à définir un connection timeout
Exemple pour
retrofit 1.9.0
restadapter = new RestAdapter.Builder().setEndpoint(Host).setLogLevel(RestAdapter.LogLevel.FULL).setClient(new OkHttpClient()
.setReadTimeout(30, TimeUnit.SECONDS)
.setConnectTimeout(30, TimeUnit.SECONDS)).build();
rénovation 2.0.0
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(10, TimeUnit.SECONDS);
client.setReadTimeout(30, TimeUnit.SECONDS);
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
retrofit 2.4.0
// setting custom timeouts
OkHttpClient.Builder client = new Builder();
client.connectTimeout(15, TimeUnit.SECONDS);
client.readTimeout(15, TimeUnit.SECONDS);
client.writeTimeout(15, TimeUnit.SECONDS);
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client.build())
.build();
}
return retrofit;
}
Une solution possible consiste à envoyer le corps de requête correct au serveur. Par exemple, le serveur a-t-il besoin de x-www-form-urlencoded
ou form-data
dans son corps de requête? Un moyen simple de tester cela consiste à utiliser Postman .