2016-10-21 8 views
6

jsonからデータを取得するのに時間がかかります。削除して、もう一度それが1分以内にjsonを取得し、私は再びjsonのボタンをクリックしたとき、それはそんなに時間がかかり、まだデータがここlistviewokhttpのjava.net.SocketTimeoutException

になっていないインストールした場合、私の例外コードは

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) 
ですここ

は、javaファイル内のJSONコードです:

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

その他のコード:

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クライアント=新しい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を使用している場合は、Builderを使用して行う必要があります。 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の一部が間違っていました)。

関連する問題