okhttp中的java.net.SocketTimeoutException

这里需要花费很多时间从json获取数据。 当删除并再次安装时,它将在1分钟内获得json ,当我再次单击json按钮时,它需要花费很多时间而且仍然没有数据进入listview

这是我的exception代码

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

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