android线程访问网络报错

发布于 2022-09-01 07:29:11 字数 2132 浏览 8 评论 0

我在写一个欢迎界面的时候,报了下面的错误,感觉很奇怪。明明是在线程中访问了网络,怎么还会报这个错误

05-22 21:42:32.855 15254-15254/com.zhu.teacherhelper E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.zhu.teacherhelper, PID: 15254
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:276)
at libcore.io.IoBridge.sendto(IoBridge.java:513)
at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)
at java.net.DatagramSocket.send(DatagramSocket.java:305)
at com.zhu.teacherhelper.utils.ServerAddressUtils.AskServerAddress(ServerAddressUtils.java:39)
at com.zhu.teacherhelper.ui.WelcomeActivity$AskServerIP.run(WelcomeActivity.java:31)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5233)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_welcome);
    Handler handler = new Handler();
    //延迟一秒后进行
    handler.postDelayed(new AskServerIP(), 1000);

}

class AskServerIP implements Runnable{

    @Override
    public void run() {
        //获取服务器ip地址
        ServerAddressUtils.AskServerAddress(getApplicationContext());

        Intent intent = new Intent(WelcomeActivity.this,MouseActivity.class);
        startActivity(intent);
        WelcomeActivity.this.finish();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

残花月 2022-09-08 07:29:11

在4.0之后,网络操作不可以放在主线程,必须异步操作,避免引起界面阻塞。
介于你是使用Handler来执行网络操作,给出以下的解决方法:

javaHandlerThread thread = new HandlerThread("NetWork");
thread.start();
Handler handler = new Handler(thread.getLooper());
//延迟一秒后进行
handler.postDelayed(new AskServerIP(), 1000);

改成这样就行了。

要注意一个点:不是Handler就是异步线程,Handler最关键的就是它的looper,如果在构建的时候没传looper进去,那么默认使用构建Handler所在线程的looper。
你构建looper的地方在onCreate方法里,即主线程,所以报错。

关于这方面的知识,你可以在去搜索以下。
慕课网上有相关的教程,可以看以下:http://www.imooc.com/learn/267

野味少女 2022-09-08 07:29:11

这个问题是从Android 4.0 开始出现,目的是将耗时的网络操作移除主线程,增加应用的及时响应,不阻塞用户交互。解决思路就是将网络请求放入异步线程进行处理,具体可以参考这篇文章啰嗦一下android中的NetworkOnMainThreadException

ぽ尐不点ル 2022-09-08 07:29:11

你的代码没有开任何一个新线程

  Handler handler = new Handler();
    //延迟一秒后进行
    handler.postDelayed(new AskServerIP(), 1000);

你的Handler是在主线程中创建的,使用无参构造方法时,Handler会被绑定到创建Handler的线程上。

然后你post了一个Runnable到Handler绑定的线程上执行.

所以实际上AskServerIP最终是在主线程上执行的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文