【发布时间】:2016-04-17 05:37:54
【问题描述】:
正在开发这个应用程序,它与网络服务器通信。
我正在使用 okHttp 发送 http 请求并获得响应。
由于某种原因,当请求花费很长时间时,我会收到 NetworkOnMainThreadException。
我找到的所有解决方案都行不通。
这是在接收数据需要很长时间之前有效的代码。
HttpGetRunnable.java
public class HttpGetRunnable implements Runnable {
private Request request;
private Response response;
public HttpGetRunnable(String route) {
String url = "http://10.0.2.2:8080" + route;
request = new Request.Builder()
.url(url)
.build();
}
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
System.err.println(e.getMessage());
}
}
public Response getResponse() {
return response;
}
}
用法
try {
HttpGetRunnable httpGet = new HttpGetRunnable("/timesheet/" + user.getId());
Thread thread = new Thread(httpGet);
thread.start();
thread.join();
Response response = httpGet.getResponse();
String jsonString = response.body().string();
// ^ throw exception on this line when taking to long
} catch (Exception e) {
e.printStackTrace(System.out);
}
错误
04-16 23:06:53.042 31145-31145/com.example.jim.app I/System.out: android.os.NetworkOnMainThreadException
.. (no caused at)
到目前为止我尝试了什么:
- 使用 Callable(与 Runnable 相同,返回 Response)
- 使用 Callable 返回响应正文字符串
- 在 ExecutorService 单池中执行 runnable
- 在 ExecutorService 单一池中提交 callable,然后在 future.get 中提交
- 使用okHttp延迟@Override方法onFailed onResponse
我就是想不通。。 我在这里做错了什么?
谢谢
附言
使用这个版本com.squareup.okhttp3:okhttp:3.2.0
【问题讨论】:
-
您使用的是什么版本的 okhttp?我记得一个关于这个的问题报告......
-
使用 com.squareup.okhttp3:okhttp:3.2.0。可以吗?这将比解释很多
-
您没有尝试 AsyncTask?
-
最好还是用okHttp的异步请求机制-github.com/square/okhttp/blob/master/samples/guide/src/main/…
-
你应该在 3.2.0 上没问题,检查这个问题的另一个问题 stackoverflow.com/questions/33266886/…