okHttp NetworkOnMainThreadException 尽管有新线程
okHttp NetworkOnMainThreadException despite to new Thread
在 android 工作室项目中,我使用 okhttp 发送 post 请求。
public void sentRequest(.... ....) {
RequestBody formBody = new FormBody.Builder().add("number", number).build();
Request request = new Request.Builder().url(serverBase + API_numberAvailabilityCheck).post(formBody).build();
call = client.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
final HashMap<String, Object> requestResult = new HashMap<>();
try {
final Response response = call.execute();
}
...........
...........
}
}).run();
}
但是它在我调用 final Response response = call.execute();
的行上抛出 NetworkOnMainThreadException
异常,尽管 new Thread
。为什么它像异常一样抛出?以及如何解决这个问题?
错误是
thread.run()
而不是 thread.start()
.
在同一线程中调用 run()
方法代码 运行,无需启动新线程。
你在这里犯了一个大错误..
new Thread(new Runnable() {
@Override
public void run() {
}
}).run();
你应该在线程上调用 start()
来启动而不是 run()
.. 如果你直接调用 运行() 那么将没有线程 运行ning 和你的Thread
将像普通 java class 一样使用普通方法 run()
..
你应该使用
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
附带说明 android 中更好的网络方法,您应该使用 Retrofit .. 它使用起来太容易了,而且它还在后台使用 OkHttp
。 .而且你再也不用担心创建线程了..
在 android 工作室项目中,我使用 okhttp 发送 post 请求。
public void sentRequest(.... ....) {
RequestBody formBody = new FormBody.Builder().add("number", number).build();
Request request = new Request.Builder().url(serverBase + API_numberAvailabilityCheck).post(formBody).build();
call = client.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
final HashMap<String, Object> requestResult = new HashMap<>();
try {
final Response response = call.execute();
}
...........
...........
}
}).run();
}
但是它在我调用 final Response response = call.execute();
的行上抛出 NetworkOnMainThreadException
异常,尽管 new Thread
。为什么它像异常一样抛出?以及如何解决这个问题?
错误是
thread.run()
而不是 thread.start()
.
在同一线程中调用 run()
方法代码 运行,无需启动新线程。
你在这里犯了一个大错误..
new Thread(new Runnable() {
@Override
public void run() {
}
}).run();
你应该在线程上调用 start()
来启动而不是 run()
.. 如果你直接调用 运行() 那么将没有线程 运行ning 和你的Thread
将像普通 java class 一样使用普通方法 run()
..
你应该使用
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
附带说明 android 中更好的网络方法,您应该使用 Retrofit .. 它使用起来太容易了,而且它还在后台使用 OkHttp
。 .而且你再也不用担心创建线程了..