Caused by: android.os.NetworkOnMainThreadException
发布日期:2021-05-04 16:26:27 浏览次数:19 分类:技术文章

本文共 3370 字,大约阅读时间需要 11 分钟。

问题:

Caused by: android.os.NetworkOnMainThreadException

at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1448)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
at java.net.InetAddress.getAllByName(InetAddress.java:787)
at com.android.okhttp.Dns$1.lookup(Dns.java:39)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
at java.net.URL.openStream(URL.java:1058)
at kotlin.io.TextStreamsKt.readBytes(ReadWrite.kt:144)
at com.easy.kotlin.bean.MovieContent.<init>(MovieContent.kt:18)
at com.easy.kotlin.bean.MovieContent.<clinit>(MovieContent.kt:10)
at com.easy.kotlin.MovieListActivity.setupRecyclerView(MovieListActivity.kt:37)
at com.easy.kotlin.MovieListActivity.onCreate(MovieListActivity.kt:33)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

主线程不能访问网络,在访问网络的代码前面添加如下代码即可:

StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

或者新开子线程(建议这种方法):

new Thread(new Runnable() {

@Override
public void run() {
Document doc = null;
try {
doc = Jsoup.connect("").get();// Jsoup是我用的一个牛叉的jar包
} catch (IOException e) {
e.printStackTrace();
}
Log.d("doc", doc.toString()+"");
}
}).start();

There are two Solution of this Problem.

  1. Don't write network call in Main UI Thread, Use Async Task for that.

  2. Write below code into your MainActivity file after setContentView(R.layout.activity_main);

if (android.os.Build.VERSION.SDK_INT > 9) {

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
And below import statement into your java file.

上一篇:归 [拾叶集]
下一篇:Spring Boot 2.0 与 Spring 5 项目实战开发(基于 Kotlin & Java )

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月25日 18时46分53秒