在这里,从json
获取数据需要很长时间。当删除并再次安装时,它将在1分钟内获得json
,当我再次单击json
按钮时,需要花费大量时间,而数据仍然没有进入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)
这里是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;
}
发布于 2016-10-21 08:08:19
IOException java.net.SocketTimeoutException
发生在下列条件下:
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(30, TimeUnit.SECONDS);
client.setReadTimeout(30, TimeUnit.SECONDS);
client.setWriteTimeout(30, TimeUnit.SECONDS);
如果您使用的是OkHttp 3,那么必须使用构建器来完成它。
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(30, TimeUnit.SECONDS);
builder.readTimeout(30, TimeUnit.SECONDS);
builder.writeTimeout(30, TimeUnit.SECONDS);
client = builder.build();
发布于 2020-06-08 15:52:45
只添加这个并不能解决您的问题:
OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
如果您使用的是Kotlin + Retrofit + Coroutines,那么只需将try
和catch
用于网络操作,例如,
viewModelScope.launch(Dispatchers.IO) {
try {
val userListResponseModel = apiEndPointsInterface.usersList()
returnusersList(userListResponseModel)
} catch (e: Exception) {
e.printStackTrace()
}
}
其中,异常是kotlin
的类型而不是java.lang
的类型。
这将处理所有的异常,
这是我的usersList()
函数
@GET(AppConstants.APIEndPoints.HOME_CONTENT)
suspend fun usersList(): UserListResponseModel
https://stackoverflow.com/questions/40170666
复制相似问题