web-dev-qa-db-fra.com

SocketTimeoutException in Retrofit

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)
34
user5418227

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

58
3bdoelnaggar

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

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 .

1
hexicle