最近在玩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开发本地及网络Mp3音乐播放器(三)MainActivity(主界面)
  2. Android最快的模拟器Genymotion试用小结
  3. Android 的网络编程(11)-Android定位功能
  4. Android模拟器的换肤和Android学习资料下载
  5. Android 模拟器 GPU ON
  6. Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够
  7. 如何在电脑上安装模拟器体验Android 4.0
  8. 基于网络音频的Android播放程序简单示例
  9. Android网络相关

随机推荐

  1. Android(安卓)-- DiskLruCache
  2. Android(安卓)NDK编程: JNI技巧
  3. Android开发1——查找所需要出示权限的内
  4. RecyclerView 入门教程(超详细)
  5. Xposed折腾笔记(一)
  6. Android(安卓)Loader(二) CursorLoader
  7. Android(安卓)开发之 ---- bootloader (LK
  8. Android(安卓)的Handle之postDelayed方法
  9. Android(安卓)Tunnel Mode
  10. Android:res之layer-list的用法