2016-10-21 7 views
6

json에서 데이터를 가져 오는 데 너무 많은 시간이 걸립니다. 삭제하고 다시 설치하는 경우는 1 분 이내에 json을 얻을 것이다 그리고 난 다시 json에 대한 단추를 클릭 할 때 너무 많은 시간과 여전히 데이터가 여기에okhttp의 java.net.SocketTimeoutException

listview 점점되지 않습니다 소요 시간 내 예외 코드

E/JSONDemo: IOExceptiojava.net.SocketTimeoutException 
    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:493) 
    at java.net.PlainSocketImpl.-wrap0(PlainSocketImpl.java) 
    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:242) 
    at okio.Okio$2.read(Okio.java:140) 
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:238) 
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:325) 
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:314) 
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:210) 
    at okhttp3.internal.http.Http1xStream.readResponse(Http1xStream.java:184) 
    at okhttp3.internal.http.Http1xStream.readResponseHeaders(Http1xStream.java:125) 
    at okhttp3.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:775) 
    at okhttp3.internal.http.HttpEngine.access$200(HttpEngine.java:86) 
    at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:760) 
    at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:613) 
    at okhttp3.RealCall.getResponse(RealCall.java:244) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:201) 
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:163) 
    at okhttp3.RealCall.access$100(RealCall.java:30) 
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127) 
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 

progress = ProgressDialog.show(MainActivity.this, "dialog title", "dialog message", true); 
Toast.makeText(MainActivity.this, "ok", Toast.LENGTH_LONG).show(); 

    if (isNetworkAvailable()) { 

     String url = "ConstantValue.URL"; 
     RequestBody formBody = new FormBody.Builder() 
       .add(employeeId, value) 
       .build(); 

     try { 
      post(url, formBody, new Callback() { 

       @Override 
       public void onFailure(Call call, IOException e) { 
        Log.e("JSONDemo", "IOException", e); 
       } 

       @Override 
       public void onResponse(final Call call, final Response response) throws IOException { 
        String JSON = response.body().string(); 
        Log.e("res", " " + JSON); 
        try { 
         JSONObject jsonObj = new JSONObject(JSON); 
         JSONArray resultarr = jsonObj.getJSONArray("result"); 
         final JSONArray resultarr1 = jsonObj.getJSONArray("result1"); 

         if (resultarr1.length() == 0) { 
          showAlertDialog("API", "Data Unavailable"); 
         } else { 

          for (int i = 0; i < resultarr1.length(); i++) { 

           Employee emp = new Employee(); 
           JSONObject result1obj = resultarr1.getJSONObject(i); 
           String result1Id = result1obj.getString("ID"); 
           String result1Name = result1obj.getString("NAME"); 
           String result1Value = result1obj.getString("VALUE"); 
           Log.e("result", " " + result1Name); 
           Log.e("result", " " + result1Value); 
           Log.e("result", " " + result1Id); 
           emp.setValue(result1Value); 
           emp.setName(result1Name); 
           emp.setId(result1Id); 

           arr.add(emp); 

          } 
         } 

         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 

           // you can access all the UI componenet 
           if (progress.isShowing()) 
            progress.dismiss(); 
           cu.notifyDataSetChanged(); 
          } 
         }); 
        } catch (Exception e) { 
         Log.e("JSONDemo", "onResponse", e); 
         showAlertDialog("API","Something went wrong"); 
        } 

       } 
      }); 

     } catch (Exception e) { 
      Log.e("JSONDemo", "Post Exception", e); 
     } 

    } else { 
     Toast.makeText(MainActivity.this, "Internet not available", Toast.LENGTH_LONG).show(); 
    } 
} 

기타 코드 :

여기 자바 파일의 JSON 코드

private final OkHttpClient client = new OkHttpClient(); 


Call post(String url, RequestBody formBody, Callback callback) throws IOException { 

    Request request = new Request.Builder() 
      .url(url) 
      .post(formBody) 
      .build(); 

    client.setConnectTimeout(30, TimeUnit.SECONDS); 
    client.setReadTimeout(30, TimeUnit.SECONDS); 
    client.setWriteTimeout(30, TimeUnit.SECONDS); 

    Call call = client.newCall(request); 
    call.enqueue(callback); 
    return call; 
} 

답변

15

IOExceptiojava.net.SocketTimeoutException 은 다음과 같은 조건에서 발생합니다.

  1. 서버가 느리고 기본 시간 초과가 적습니다. 그래서 당신에 따라 시간 제한 값을 넣으십시오.
  2. 서버는 정상적으로 작동하지만 시간 초과 값은 더 짧은 시간 동안 발생합니다. 타임 아웃 값을 변경하십시오. 아래의 코드 스 니펫과 같습니다.

OkHttpClient client = new OkHttpClient();

client.setConnectTimeout(30, TimeUnit.SECONDS); 
client.setReadTimeout(30, TimeUnit.SECONDS); 
client.setWriteTimeout(30, TimeUnit.SECONDS); 

okhttp3을 사용하는 경우에는 작성기를 사용해야합니다.

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.connectTimeout(30, TimeUnit.SECONDS); 
builder.readTimeout(30, TimeUnit.SECONDS); 
builder.writeTimeout(30, TimeUnit.SECONDS); 
client = builder.build(); 
+0

편집했지만 여기서는 client.setConnectTimeout (30, TimeUnit.SECONDS); client.setReadTimeout (30, TimeUnit.SECONDS); client.setWriteTimeout (30, TimeUnit.SECONDS); – Abhi

+4

@Abhi okhttp3을 사용하는 경우 빌더를 사용하여 수행해야합니다. OkHttpClient.Builder builder = 새로운 OkHttpClient.Builder(); builder.connectTimeout (30, TimeUnit.SECONDS); builder.readTimeout (30, TimeUnit.SECONDS); builder.writeTimeout (30, TimeUnit.SECONDS); 클라이언트 = builder.build(); – Cognoscis

+0

@ Cognoscis 나는 그 정보/코드로 답을 제출해야한다고 생각한다. –

-1

제 경우에는 잘못된 URL (서버가 맞지만 URL의 일부가 잘못되었습니다)을 요청했습니다.