okHttp NetworkOnMainThreadException 尽管有新线程
Posted
技术标签:
【中文标题】okHttp NetworkOnMainThreadException 尽管有新线程【英文标题】:okHttp NetworkOnMainThreadException despite to new Thread 【发布时间】:2019-12-11 17:47:49 【问题描述】:在 android studio 项目中,我使用 okhttp 发送帖子请求。
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
。为什么它会抛出异常?以及如何解决这个问题?
【问题讨论】:
How do I fix android.os.NetworkOnMainThreadException?的可能重复 OkHttp 可以为您处理线程。使用enqueue()
而不是execute()
。
【参考方案1】:
错误是
thread.run()
而不是thread.start()
。
调用run()
方法代码在同一个线程中运行,无需启动新线程。
【讨论】:
【参考方案2】:你在这里犯了一个巨大的错误..
new Thread(new Runnable()
@Override
public void run()
).run();
您应该在线程上调用start()
来启动而不是run()
.. 如果您直接调用run() 那么将没有线程在运行并且您的Thread
将像普通的java 类一样使用普通的方法run()
..
你应该使用
new Thread(new Runnable()
@Override
public void run()
).start();
附带说明一个更好的在 android 中联网的方法,您应该使用 Retrofit .. 它太容易使用了,而且它还在引擎盖下使用了 OkHttp
.. 而且您不必担心创建线程不再..
【讨论】:
以上是关于okHttp NetworkOnMainThreadException 尽管有新线程的主要内容,如果未能解决你的问题,请参考以下文章
okhttp和第三方封装好的OKHttp库-okhttp-utils
Android 开源框架 ( 二 ) 基于OkHttp进一步封装的okhttp-utils介绍
Android OkHttp完全解析 是时候来了解OkHttp了