问题描述
- 连接网络异常java.net.SocketTimeoutException
- 我用模拟器Android2.3.3版本跑,是可以连接网络获取到数据的,但用真机(Android4.0版本)运行就出现android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
......
网上说在onCreate()方法里面加上
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
但我添加之后就出现上面的问题:java.net.SocketTimeoutException: failed to connect to /172.16.58.88 (port 8080) after 5000ms希望高手能给予指导,谢
解决方案
Android4.0以后就不能再主线程中进行网络请求等费时性操作,要不然就会报anr异常,这主要也是从用户体验的角度考虑问题的,想象一下,如果你手机
网速比较慢时,这个时候请求了一个网络数据,在数据没有返回时,你的界面就不会有任何可供展示的数据,就一直卡在那里,影响用户体验。
new Thread(){
public void run(){
// 做网络请求操作
}
}.start();
就可以解决问题了。如果需要网络数据请求后做一些处理,就可以用到handler这个类去编写代码。
解决方案二:
android2.3以上版本是不允许在主线程中做网络操作,因为你的真机是Android4.0版本,所以会报异常:android.os.NetworkOnMainThreadException,请另起线程做网络操作
解决方案三:
socket 超时了,看看是不是网络不通造成的。
解决方案四:
在主线程里面,不能访问网络,那些设置不建议用,还是另一起一个线程访问网络吧
解决方案五:
看看你有没有添加访问网络的权限
解决方案六:
从字面可以知道是,在主线程中进行网络请求异常:
从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、用户体验差
在Honeycomb SDK(3.0)以下的版本,你还可以继续在Main Thread里这样做,在3.0以上,就不行了。网上有很多解决方法,例如thread或者asynctask都可以的
解决方案七:
这个应该有配置超时的地方吧,你把超时时间配置的长一点,另外就是在你调用的地方记录日志观察你这个远程调用耗时到底是多少。
解决方案八:
要访问网络进行操作,还是建议不要在主线程里面写,你可以在异步任务的doInBackground里面进行网络访问操作
解决方案九:
网络请求超时,是因为在主线程里向网络发送了请求。可以考虑新开线程处理网络请求,用thread + handler模式或者异步任务模式都可以做到。
解决方案十:
最简单的 new Thread,在run里面执行网络请求