android 4.1 在线模拟,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

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

48845891_1.gif

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 }

48845891_1.gif

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

48845891_1.gif

1 //网络通信

2 private HttpPost request;

3 private List 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();

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 }

48845891_1.gif

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

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

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

48845891_1.gif

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 }

48845891_1.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值