Android与Tomcat服务器的数据交互
2015年04月28日 17:14:43 Android ⁄ 共 2810字 暂无评论 ⁄ 被围观 2,562次

在 WEB 开发中,常常用到的服务器是 Tomcat,想把 WEB 项目在手机上实现时,最省事的办法就是只需要在 Android 上实现 UI 编程即可,服务器还是用原来 WEB 项目的服务器,所以后台代码几乎不需要修改,这样可以省下不少开发时间。

那么如何用让 Android 和 Tomcat 实现数据的交互呢?由于 WEB 项目开发大多用 post 请求,所以为了实现后台代码的复用,在 Android 中用 HttpPost 请求服务器即可。

后台接受请求的代码如下:

Code   ViewPrint
  1. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.     request.setCharacterEncoding("utf-8");  
  3.     response.setCharacterEncoding("utf-8");  
  4.     String jsonStr = request.getParameter("JSONDATA");  
  5. }  

 

那么,在 Android 中用 HttpPost 发送请求的方式如下:

Code   ViewPrint
  1. // URL使用基本URL即可,其中不需要加参数  
  2. HttpPost httpPost = new HttpPost(http://127.0.0.1:8080/android/funcServlet");  
  3. // 需要客户端对象来发送请求  
  4. HttpClient httpClient = new DefaultHttpClient();  
  5. HttpResponse response = null;  
  6.   
  7. // 设置参数  
  8. List<NameValuePair> params = new ArrayList<NameValuePair>();  
  9. params.add(new BasicNameValuePair("JSONDATA", data)); 
  10.  
  11. // 生成请求实体 
  12. HttpEntity requestHttpEntity = new UrlEncodedFormEntity(params, "utf-8");  
  13. // 将请求体内容加入请求中  
  14. httpPost.setEntity(requestHttpEntity);  
  15. // 发送请求  
  16. response = httpClient.execute(httpPost);  

 

处理返回的 response:

Code   ViewPrint
  1. String result = "";  
  2. if (null == response) {  
  3.     return "无数据返回!";  
  4. }  
  5. HttpEntity httpEntity = response.getEntity();  
  6. try {  
  7.     InputStream inputStream = httpEntity.getContent();  
  8.     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));  
  9.       
  10.     String line = "";  
  11.     while (null != (line = reader.readLine())) {  
  12.           result += line;  
  13.     }  
  14. catch (Exception e) {  
  15.     e.printStackTrace();  
  16. }  
  17.  System.out.println(result);  

 

但是,运用的过程中,在以前的 Android 版本中,如 2.2、2.3 等,这样发送请求没有问题,但是在新版本中,如 4.0 以上,会报错,提示请求异常。原因是 Android 新版本不允许主线程运行网络请求,4.0 以后不能在主线程访问网络,而必须在一个新线程中访问才可以。

所以,解决方法有两种,一种方法是新创建一个线程,在新线程中访问数据。还有一种简便的方法,就是在 Android 的主画面的 Activity 的 onCreate 方法中,加入下面的代码即可。

Code   ViewPrint
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.activity_main);  
  4.           
  5.     int SDK_INT = android.os.Build.VERSION.SDK_INT;  
  6.         if (SDK_INT >= 11) {  
  7.             StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  8.                             .detectDiskReads().detectDiskWrites()  
  9.                             .detectNetwork() // 这里可以替换为detectAll()  
  10.                                                 // 就包括了磁盘读写和网络I/O  
  11.                             .penaltyLog() // 打印logcat,当然也可以定位到dropbox,通过文件保存相应的log  
  12.                             .build());  
  13.             StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  14.                     .detectLeakedSqlLiteObjects() // 探测SQLite数据库操作  
  15.                     .penaltyLog() // 打印logcat  
  16.                     .penaltyDeath().build());  
  17.         }  
  18. }  

 

注意,请求时,一定要在 Android 配置文件 AndroidManifest.xml 中加入访问网络的权限(如下),否则怎么调试都白搭。

  1. <uses-permission android:name="android.permission.INTERNET"/>  

给我留言

留言无头像?