为了账号安全,请及时绑定邮箱和手机立即绑定

android线程访问网络报错

android线程访问网络报错

沧海一幻觉 2019-04-10 20:48:35
我在写一个欢迎界面的时候,报了下面的错误,感觉很奇怪。明明是在线程中访问了网络,怎么还会报这个错误05-2221:42:32.85515254-15254/com.zhu.teacherhelperE/AndroidRuntime﹕FATALEXCEPTION:mainProcess:com.zhu.teacherhelper,PID:15254android.os.NetworkOnMainThreadExceptionatandroid.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)atlibcore.io.BlockGuardOs.sendto(BlockGuardOs.java:276)atlibcore.io.IoBridge.sendto(IoBridge.java:513)atjava.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:184)atjava.net.DatagramSocket.send(DatagramSocket.java:305)atcom.zhu.teacherhelper.utils.ServerAddressUtils.AskServerAddress(ServerAddressUtils.java:39)atcom.zhu.teacherhelper.ui.WelcomeActivity$AskServerIP.run(WelcomeActivity.java:31)atandroid.os.Handler.handleCallback(Handler.java:739)atandroid.os.Handler.dispatchMessage(Handler.java:95)atandroid.os.Looper.loop(Looper.java:135)atandroid.app.ActivityThread.main(ActivityThread.java:5233)atjava.lang.reflect.Method.invoke(NativeMethod)atjava.lang.reflect.Method.invoke(Method.java:372)atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)代码如下:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);Handlerhandler=newHandler();//延迟一秒后进行handler.postDelayed(newAskServerIP(),1000);}classAskServerIPimplementsRunnable{@Overridepublicvoidrun(){//获取服务器ip地址ServerAddressUtils.AskServerAddress(getApplicationContext());Intentintent=newIntent(WelcomeActivity.this,MouseActivity.class);startActivity(intent);WelcomeActivity.this.finish();}}
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在4.0之后,网络操作不可以放在主线程,必须异步操作,避免引起界面阻塞。
介于你是使用Handler来执行网络操作,给出以下的解决方法:
javaHandlerThreadthread=newHandlerThread("NetWork");
thread.start();
Handlerhandler=newHandler(thread.getLooper());
//延迟一秒后进行
handler.postDelayed(newAskServerIP(),1000);
改成这样就行了。
要注意一个点:不是Handler就是异步线程,Handler最关键的就是它的looper,如果在构建的时候没传looper进去,那么默认使用构建Handler所在线程的looper。
你构建looper的地方在onCreate方法里,即主线程,所以报错。
关于这方面的知识,你可以在去搜索以下。
慕课网上有相关的教程,可以看以下:http://www.imooc.com/learn/267
                            
查看完整回答
反对 回复 2019-04-10
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

这个问题是从Android4.0开始出现,目的是将耗时的网络操作移除主线程,增加应用的及时响应,不阻塞用户交互。解决思路就是将网络请求放入异步线程进行处理,具体可以参考这篇文章啰嗦一下android中的NetworkOnMainThreadException
                            
查看完整回答
反对 回复 2019-04-10
  • 2 回答
  • 0 关注
  • 458 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信