分享

Android客户端获取服务器的json数据(二)

 随身Book 2013-11-02

 这一周课很多,所以没有及时的接上。

现在的我不打算再拼命的做码农了,而是尽量的做总结。把以前写过的一些代码回忆一下,把以前有过的思路再重新寻觅一回。似乎,我好多废话。

在做Android应用程序开发时,有很多应用都会获取由Web Server返回的数据,有的可能是xml数据,有可能是json数据。他们各有应用范围。我继续总结一下获取网络json数据的一些idea。这里先分析一下业务逻辑,UI稍后再唠叨。

1.分析一下手机购物应用的执行过程。

首次执行一个MainActivity,此activity的功能是构成main UI(即下方有个Tab 菜单),由于我的没个Activity都是继承了上文中的IMActivity接口,这里实现初始化init()方法。我们都知道Activity的生命周期,所以我在onResume()方法里调用init()方法。并且,初始化方法完成几个任务。

  1.1 检查网络连接

    android系统有提供检测网络的api。我们可以很方便的调用。我们可以把检查网络的方法封装在一个工具类里(可根据自己的programing style)

  

复制代码
package com.mpros.util;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/***
 * 工具类,检查当前网络状态
 * 
 * @author shuimu
 * 
 */
public class NetUtil {

    public static boolean checkNet(Context context) {

        // 获取手机所以连接管理对象(包括wi-fi,net等连接的管理)

        ConnectivityManager conn = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (conn != null) {
            // 网络管理连接对象
            NetworkInfo info = conn.getActiveNetworkInfo();
            
            if(info != null && info.isConnected()) {
                // 判断当前网络是否连接
                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
            
        }

        return false;
    }
}
复制代码

 

  1.2如果网络连接正常,启动服务Service。否则提醒用户网络连接异常。网络连接异常的方法,我封装在了MainService中,可以直接invoke。

    

复制代码
    @Override
    protected void onResume() {

        super.onResume();
        init();
    }

    @Override
    public void init() {
        if (NetUtil.checkNet(this)) {
            Intent startService = new Intent("com.mpros.service.MainService");
            this.startService(startService);
        } else {
            MainService.alerNetErr(this);
        }
    }
复制代码

  

2.当MainActivity执行到onResume()方法时,会启动服务。正常情况下,MainService开始执行onCreate()方法。此方法里,启动线程,因为我的MainService是实现了Runnbale接口的。

View Code

3.于是,后台服务框架正常搭建起来了。子线程一直在获取任务,只要有任务的时候,取走任务,然后就执行任务。

  run方法:

View Code

4.插叙一下Handler。

  在每个Acitivity和Service主线程下,有一个Handler对象负责线程通信,消息传递,更新UI。(我是这么理解的)。通常采用异步实现网络通信,通过Handler来做数据媒介,然后把数据显示在界面上来。

  主要涉及Message对象和handMessage(Message msg)方法。有时候还常用Handler对象的postXXX(Runnable run)方法。此方法有几个重载方法。就是加入一个Runnable(api:Represents a command that can be executed,表示可执行的命令)到Handler对象的附属子线程队列里。

5.理一下doTask(Task task)方法。

  5.1先瞧瞧系统要执行的任务Task

  

View Code

  这里我声明成了原生类型了,但在Java里,在使用HashMap或者Map,常常会涉及泛型,如:Map<?,?> map ;

  5.2 首先创建一个消息对象

  Message msg = new Message();

  5.3 赋予消息的标识,这里把任务编号赋予它。

  msg.what = task.getTaskId();

  5.4 通过switch语句,根据任务ID分别执行任务。具体代码上文已贴了。

6.在点击获取产品分类时,会转至相应分类的Activity。在初始化方法里,老规矩先检查网络,然后新建任务,该任务表示获取产品分类。

 

View Code

7.MainService会马上收到任务,然后调用doTask方法。根据编号,执行获取产品分类任务。

View Code

8.封装通过Http获取请求响应(HttpResponse)以及通过一个图片的URL,然后返回一张位图(BitmapDrawable)的工具类HttpUtil.

View Code

9.解析json数据的业务。

  通过HttpUtil获取一个HttpResponse.

  HttpResponse response = HttpUtil.getHttpResponse(action);//在浏览器里输入此action,浏览器里可显示一串json数据。

  测试响应码

  // 响应code
    int rescode = response.getStatusLine().getStatusCode();如果rescode 为200,表示获取ok.

  然后通过response.getEntity().getContent();方法返回获取的所有数据,在转化为StringBuffer变长字串。再根据字段来解析。

View Code

10.在执行获取产品类型时,正常的话会返回解析好的产品类型对象列表list。然后通过handler对象传递该list,根据任务id去更新UI。

 

View Code

11.在ClassifyActivity里实现refresh方法。

  

View Code

12.执行一个任务的逻辑顺序就是这样了,

  通过UI新建任务  ---> 后台服务获取任务并执行任务 ---> 通过相应的方法获取的数据 ---> Hanlder传递数据 ---> 返回原来的UI ---> UI是否更新.

有时间会再补充我觉得比较有用的UI设计。

 

 

 

 

 

 

 

 

  

 

 

 

    

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多