2016-08-30 30 views
15

Próbuję wysłać do serwera POST w celu pobrania danych, ale czasami Występuje SocketTimeoutException!SocketTimeoutException w Retroficie

Użyłem Ok3Client do rozwiązania, ale mam do czynienia z tym samym wyjątkiem Jak mogę to rozwiązać?

Moje kodu jest poniżej

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

Mój dziennik błędów jest

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

Czy ktoś może pomóc rozwiązać ten problem? –

+0

Prawdopodobny duplikat [Getting java.net.SocketTimeoutException: Connection time out out in android] (http://stackoverflow.com/questions/15608499/getting-java-net-sockettimeoutexception-connection-timed-out-in-android) – Soham

+0

@Komal jak zatrzymać awarię? Czy znalazłeś jakieś rozwiązanie? Proszę udostępnić .. –

Odpowiedz

15

Zapobieganie SocketTimeoutException jest poza naszym limicie ... Jednym ze sposobów, aby skutecznie obsłużyć to jest zdefiniowanie connection timeout

Przykład dla

modernizacyjny 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(); 

modernizacyjny 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(); 
+0

Nie można rozwiązać metody readTimeout (30, TimeUnit.SECONDS) i connectTimeout (30, TimeUnit.SECONDS)). Build(); –

+0

Czy używasz ''com.squareup.okhttp3: okhttp: 3.4.1'' @Komal – Soham

+0

Używam kompilacji' com.squareup.okhttp3: okhttp: 3.0.0 ' –

30

zwiększyć czas, gdy ściągam bierze więcej czasu wykorzystać ten kod pracował dla mnie

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(); 
+2

To nie przeszkadza awarii aplikacji w naszej aplikacji. Czy istnieje sposób na poradzenie sobie z tym bez awarii aplikacji? –

+0

czym jest wyjątek, to Null Pointer – 3bdoelnaggar

+0

Twoja aplikacja spróbuje załadować zawartość, nawet jeśli serwer odpowiada po dłuższym czasie - To obejście, a nie rozwiązanie :) – tryp

0

Możliwe rozdzielczości f lub upewnij się, że wysyłasz prawidłową treść żądania do serwera. Na przykład, czy serwer potrzebuje x-www-form-urlencoded lub form-data w treści żądania? Prostym sposobem sprawdzenia tego jest użycie Postman.