Java.net.SocketTimeoutException in okhttp

It takes so long to get data from json . When it is removed and installed again, it will receive json for 1 minute, and when I press the button for json again, it takes a lot of time and still the data does not get into listview

Here is my exception code

 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) 

here is the json code in the java file:

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

Other codes:

 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; } 
+6
source share
2 answers

IOExceptiojava.net.SocketTimeoutException occurs under the following condition.

  • The server is slow, and the default timeout is less. so just enter the timeout value according to you.
  • The server is working fine, but the wait time is shorter. therefore, change the timeout value. as below code snippet.

OkHttpClient client = new OkHttpClient ();

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

If you are using okhttp3, you must do this with a builder.

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

In my case, I requested the wrong URL (the server was right, but part of the URL was incorrect).

-one
source

Source: https://habr.com/ru/post/1011536/


All Articles