最近在玩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-Emulator】Android模拟器介绍和基本使用
  3. android 杂
  4. Android中设置Ethernet为默认网络类型
  5. Roboletric+Retrofit2单元测试
  6. Android中的网络管理源码分析--netd
  7. 基于Restful架构规范的Android的网络请求框架Retrofit
  8. Android(安卓)判断网络状态及开启网路
  9. Android访问Tomcat错误以及mp3player项目乱码问题解决

随机推荐

  1. Android拦截短信并通知栏提醒
  2. android进阶 重写view来实现全新控件
  3. Android(安卓)editText自动弹出软键盘
  4. streamingAssetsPath 内文件读取
  5. android-Paint-getTextBounds参数详解
  6. TabLayout的基本使用结合Viewpager(Androi
  7. 导入工程,添加jar包之后还是报错?
  8. Connecting to MySQL database
  9. 自定义的dailog
  10. Tween动画xml