问题:
在Android项目中实现Socket通信,服务器端使用main方法创建ServerSocket,运行启动服务器时报错“Error: ShouldNotReachHere() ”。

原因分析:
java中使用main函数作为应用程序的接口,class的生命周期始于main方法,终于main方法。Android虽然使用的是java语法,但是却不使用main作为程序入口,一个activity启动时要经过onCreate()方法、onStart()方法和onResume()方法才算完全启动,而且这些方法都是自动调用的,这是与java application运行的最大不同处。所以如果你新建的是Android Project,那么程序默认使用的就是android.jar来作为程序运行时环境,但是由于我们按照惯例将服务器端ServerSocket的启动放在main方法中,android无法解析,所以会报出“Error: ShouldNotReachHere() ”错误,就是说程序永远不会执行到这里。

解决方案一:
隔离服务器端和客户端。将服务器端ServerSocket的创建移到Android项目之外的一个Java Project中,先运行这个Java Project,启动ServerSocket,再运行客户端所在的Android Project。http://www.apkbus.com/android-14537-1-1.html
解决方案二:
更改服务器端运行时环境。将ServerSocket依旧写在Java类中的main方法中,在IDE左边的Package Exployer中选中项目,点击鼠标右键,选择“Run as——>Run configuration”,在弹出窗口的左边框内找到“Java application——>ServerSocket类”,在右边框内找到Classpath选项,找到其中的Bootstrap Entries,选中其中的android.jar,点击右边remove按钮将其删除,然后点击Advanced按钮,选择Add Libaby选项,点击ok按钮,在弹出的对话框中选择JRE System Library,点击“next”按钮,选择Workplace Default JRE选项,点击“finish”按钮即可完成配置。http://stackoverflow.com/questions/2543106/fatal-error-by-java-runtime-environment
解决方案三:
使用Android中的Activity创建服务器ServerSocket。这种方案应该将服务器和客户端都写在同一个Activity中的不同方法中,先启动服务器方法,再启动客户端方法。这是因为Android中一个Activity就代表了一个屏幕,如果你将服务器和客户端写在不同的Activity中,先启动服务器Activity,再跳转到客户端Activity,那么服务器Activity就会执行onPause()回调方法,相当于关闭Socket服务器了。
解决方案四:
使用Android中的Service创建服务器ServerSocket。创建一个Service用来存放Socket服务器代码,再创建一个Activity来存放Socket客户端代码和显示通信信息。运行时先通过Activity启动Service,再启动客户端代码的Activity。由于Android中的Service是后台运行,所以即使跳转Activity也不会关闭服务。

总结:
这四种方案中,第一种将服务器和客户端分隔在不同项目中,不利于管理;第三种方案将客户端和服务器代码写在同一个类中,显得杂乱而且不符合实际情况。个人觉得可取的是第二种和第四种方案,特别是第四种方案。第二种方案夹杂了Android和Java环境处理,第四种方案则是纯粹的Android应用,而且用到了Android中的Service,“Service——Activity”更符合Socket的“服务器——客户端”模式。

更多相关文章

  1. android studio中的so库调用
  2. 细说:AndroidStudio插件
  3. 毕业设计遇到的问题及解决方法
  4. Android逐帧动画,逐帧动画加载图片过多时OOM异常的解决和替代方法
  5. android sms接收流程(ril分析)
  6. 属性方法介绍——View(1)
  7. JS 判断浏览器客户端类型(ipad,iphone,android)
  8. Parcelable和Parcel
  9. Android实现判断某个服务是否正在运行的方法

随机推荐

  1. android json实现网络请求 和普通的http
  2. Android屏幕元素层次结构
  3. Android(安卓)Scroller简单用法
  4. android 5.0新特性
  5. Android之简易天气预报小应用(xml解析练手
  6. duplicate files during packaging of ap
  7. Android系统启动
  8. Android中的广播也定向
  9. 实现android启动界面字体的动画效果
  10. 初窥图像处理利器RenderScript