打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

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

在做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设计。

 

 

 

 

 

 

 

 

  

 

 

 

    

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
《Android项目式程序设计》12 网络编程写字字帖
详解Android中AsyncTask的使用
关于AsyncTask与Handler
android AsyncTask介绍
Android 多线程编程的总结
AsyncTask和Handler两种异步方式的实现和区别比较
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服