最近在参加学校安排的学期实训,主要的项目是根据实训需求实现基于WEB的旅游分享平台,并实现对应的Android客户端(截止到2012-07-16,Android的最高版本是4.1,可以在http://www.android.com/上查看最近更新)。

  在开发Android应用平台的时,遇到的第一个比较麻烦的问题就是在Android模拟器中访问服务器接口。

1. 最先犯的错误就是:在连接服务器的时候使用 127.0.0.1 或者 localhost 来指定本机PC机器。 由于Android客户端在测试的时候是在Android模拟器中运行的,所以127.0.0.1并不会指向PC开发机,而是指向模拟器。 为了在测试的时候能够访问到本机PC开发机提供的接口,需要在服务器地址连接中使用 10.0.2.2:8080来指向本机PC机, 或者使用PC机当前的IP地址也可以。如下连接地址:

1 public static String server_url = "http://10.0.2.2:8080/travel";

  2. 在Android应用的AndroidManifest.xml中添加网络权限:

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

  3. 由于Android 4.1对于网络限制比较的严格,所以在处理网络连接的时候需要调用以下代码。 我将其封装在一个通用的方法中,如下所示:

  

复制代码
 1 @SuppressLint("NewApi") 2     public static void StrictMode() { 3         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 4             .detectDiskReads() 5             .detectDiskWrites() 6             .detectNetwork() 7             .penaltyLog() 8             .build());    9     10         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()11             .detectLeakedSqlLiteObjects()12             .penaltyLog()13             .penaltyDeath()14             .build()); 15     }    
复制代码

  4. 在Android客户端访问服务器接口的方法有很多,我使用的是 HttpPost来完成服务器请求的。 具体的代码如下:

复制代码
 1 //网络通信 2     private HttpPost request; 3     private List<NameValuePair> params; 4     private HttpClient client; 5     private HttpResponse response; 6     private String server_url = Util.server_url + "/servlet/user" ; 7  8  9 //创建线程时,初始化参数10             params = new ArrayList<NameValuePair>(); 11             params.add(new BasicNameValuePair("action", Util.USER_LOGIN));12             params.add(new BasicNameValuePair("username", username));13             params.add(new BasicNameValuePair("password", password));14 15 16 //处理用户登录17             try{18                 request = new HttpPost(server_url);19                 request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));20                 21                 client = new DefaultHttpClient();22                 response = client.execute(request);23                 24                 if(response.getStatusLine().getStatusCode() == 200) {25                     JSONArray array = new JSONArray(EntityUtils.toString(response.getEntity()));26                     JSONObject result = array.optJSONObject(0);27                     28                     if(result.getInt("status") == 0){29                         USER = result.getJSONObject("user");30                         login_handler.sendEmptyMessage(LOGIN_SUCCESS);31                     }else{32                         login_handler.sendEmptyMessage(LOGIN_FAILED);33                     }34                 }else {35                     login_handler.sendEmptyMessage(LOGIN_FAILED);36                 }37             }catch(Exception e){38                 login_handler.sendEmptyMessage(LOGIN_EXCEPTION);39             }finally{40                 progress.dismiss();41             }
复制代码

这里只是展示了整个发送请求的三个阶段:声明网络通信API对象、初始化参数并添加到List列表、发送请求并处理请求。



在Android应用中,主要分为UI主线程和子线程。 其中,UI主线程负责屏幕元素的操作,子线程则处理数据的请求,不能对屏幕元素进行操作, 这二者通过Handler 或者继承子Handler对象的子类对象来完成通信。 一般Handler对象主要使用三个方法: sendEmptyMessage(SUCCESS)、handleMessage(Message msg)。

如上述代码所示,在子线程处理完数据之后,通过使用sendEmptyMessage方法来返回操作的状态值,Handler类中的handleMessage会根据返回的状态值自动对数据进行处理。 一个最简单的Handler子类的定义如下:

复制代码
 1 class LoginHandler extends Handler{ 2  3         @Override 4         public void handleMessage(Message msg) { 5             // TODO Auto-generated method stub 6             super.handleMessage(msg); 7  8             switch(msg.what){ 9                 case LOGIN_SUCCESS:10                     try {11                         onLoginSuccess();12                     } catch (JSONException e) {13                         e.printStackTrace();14                     }15                     break;16                 case LOGIN_FAILED:17                     onLoginFailed();18                     break;19                 case LOGIN_EXCEPTION:20                     onLoginException();21                     break;22             }23         }

更多相关文章

  1. Android 采用HttpClient提交数据到服务器
  2. android之eclipse下查看android系统源代码
  3. Android多线程系统概述(sundy深入浅出)之进程和线程
  4. Android直播实现(二)srs流媒体服务器部署
  5. Android从代码到apk的编译过程
  6. Android怎么从服务器端获取数据
  7. android应用安全——代码安全(android代码混淆)
  8. Android App卡顿慢优化之多线程优化
  9. Android Studio如何设置代码自动提示

随机推荐

  1. Android 让按钮闪烁(点击的时候停止闪烁)
  2. android一种较为复杂的布局参考(xml文件)
  3. Android new vendor ID enable
  4. Android 图片压缩的方法大全
  5. Android 左右滑动 控件
  6. Android适配器之------BaseAdapter(例子)
  7. Android GridView,Gallery动态更新数据
  8. Android(安卓)Studio 使用二三事----' '
  9. Android的按钮按下效果
  10. Android用悬浮按钮实现翻页效果