zoukankan      html  css  js  c++  java
  • Android 4.1模拟器访问服务器接口

      最近在参加学校安排的学期实训,主要的项目是根据实训需求实现基于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         }

      

  • 相关阅读:
    高级数据结构实现——自顶向下伸展树
    优先队列——二项队列(binominal queue)
    优先队列——左式堆
    近似装箱问题(两种脱机算法实现)
    近似装箱问题(三种联机算法实现)
    Instruments
    CALayer之 customizing timing of an animation
    PKCS填充方式
    使用Xcode和Instruments调试解决iOS内存泄露
    apple网址
  • 原文地址:https://www.cnblogs.com/undead/p/internet_android.html
Copyright © 2011-2022 走看看