这一周课很多,所以没有及时的接上。 现在的我不打算再拼命的做码农了,而是尽量的做总结。把以前写过的一些代码回忆一下,把以前有过的思路再重新寻觅一回。似乎,我好多废话。 在做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。
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 然后通过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设计。
|
|