最近在玩android,学习到网络这一部分,写了一个电脑本机做服务器,模拟器做客户端的socket通信程序,但手机模拟器客户端就是连不上电脑的服务器端,执行到Socket socket=new Socket("xx.xx.xxx.xxx",8888);就抛异常。我又自己写了一个普通的Java客户端,测试能连上服务器端。所以代码应该没有问题,问题就在于手机模拟器。同学的电脑上装了2.0的android模拟器,我用同学的手机模拟器测试也能连上服务器端。所以可能是模拟器版本的问题。几经周折,无法解决,暂且搁置。

紧接着,我又写了一个通过Http去请求Tomcat 服务器上的资源,执行到DefaultHttpClient().execute(httpPostRequest)就抛异常,但在模拟器的浏览器上通过同样的地址就可以访问到资源,百度之没解决。

感觉很郁闷,网络的两个程序都被搁置了,但感觉它们的错误原因应该是一样。故又单步调试之,发现 socket程序出现android.os.NetworkOnMainThreadException异常,百度之,终于找到前两个程序失败的原因了,我用的是Android 4.0版本,而Android 3.0以上对网络有了更多的限制。

总结如下, Android网络编程要注意以下两点:

一。android里自己电脑的IP地址是10.0.2.2,不能用127.0.0.1或者localhost,即最好使用自己电脑的IP
二。Android 3.0以上不能在android的主线程中执行一个网络操作,否则会出现 android.os.NetworkOnMainThreadException异常,因为主线程的操作

不能超过5秒,否则就报错了,解决方法:
(1)另开一个线程去做网络连接的操作;
(2)在activity类中的onCreate方法中添加strict代码,如下:
Java代码
public void onCreate() {
.......
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
}

问题解决了,很是高兴呀,呵呵

更多相关文章

  1. Android网络收音机项目(源码实例分享)
  2. Android之利用HTTP网络通信实现与PHP的交互(三)
  3. 酷比魔方iwork8连接电脑调试adb
  4. Android的通信机制与网络(二)
  5. Android平板电脑使用评测
  6. 游走Android系列之网络通信
  7. android使用ImageView加载本地SdCard图片和加载网络图片

随机推荐

  1. android启动其他应用的一段代码
  2. React Native物理back返回键的使用
  3. Android 重新获取验证码 倒计时
  4. android经常调用的组件
  5. Android(安卓)Service两种启动方式
  6. Android-Intent的使用方法详解
  7. Android RecyclerView的简单使用
  8. Android 修改系统时间代码
  9. 开源镜像站-Androd镜像
  10. Android Studio电脑不支持HAXM的解决办法