Android基于IIS的APK下载(三)用JSON传输更新数据

在《Android基于IIS的APK下载(二)显示更新列表一文中已经在界面中显示了更新列表,那这个更新列表的数据是如何来的呢?我们看到UpdateItemsAdapter的构造函数中传入了一个updateItems的参数,这就是更新列表的数据,所以我们现在的关键就是获取updateItems。

由于我们是基于网络传输数据的,那网络中数据传输主要有哪此呢?比较常用的有json、xml。在量级上,json又比xml更加轻量,而且java中有相应的库支持json的解析,所以考虑使用json来实现。

要从网络中获取数据,肯定要发起请求,所以要有相应的url。在发起请求后,必须要有服务器来响应,所以必须要有相应的服务器。这里我们用IIS来作为服务器,后续的文章中会作一些讲解。假定同在已经架设好了IIS服务器,并且在MIME中添加了json格式文件的支持,现在我们就可以发起请求了。下面是实现的代码。

UpdateLoader.java

package com.example.apkupdate;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

import com.kitsp.httpsp.RequestSp;

public class UpdateLoader {

	private String _updateUrl = "http://192.168.1.5:9000/update.json";

	@SuppressWarnings("finally")
	public List<UpdateItem> AnalyUpdate() {
		List<UpdateItem> updateItems=null;
		try {
			HttpEntity responseEntity = RequestSp.GetHttpEntity(_updateUrl);
			if(responseEntity==null||responseEntity.getContentLength()<=0)
			{
				return null;				
			}
			
			String responseStr = EntityUtils.toString(responseEntity, "UTF-8");
			if(responseStr==null||responseStr.length()<=0)
			{
				return null;				
			}
			
			JSONArray jsonObjs = new JSONObject(responseStr).getJSONArray(UPDATE_KEYS.ITEMS);
			if(jsonObjs==null||jsonObjs.length()<=0)
			{
				return null;				
			}
			
			int itemCount=jsonObjs.length();
			updateItems=new ArrayList<UpdateItem>();
			for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) {	
				
				JSONObject jsonObject = jsonObjs.getJSONObject(itemIndex);
				UpdateItem updateItem=new UpdateItem();	
				updateItem.SetName( jsonObject.getString(UPDATE_KEYS.NAME));
				updateItem.SetFeaturePackage(jsonObject.getString(UPDATE_KEYS.FEATURE_PACKAGE));
				updateItem.SetNewVersion(jsonObject.getString(UPDATE_KEYS.VERSION));
				updateItem.SetUrl(jsonObject.getString(UPDATE_KEYS.URL));		
				
				updateItems.add(updateItem);
			}				
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();	
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally
		{
			return updateItems;
		}
		
	}
}

注:

1、获取新更列表的url,默认为http://192.168.1.5:9000/update.json.其中http://192.168.1.5:9000为服务器的地址,update.json为更新列表的具体数据文件。

2、RequestSp.GetHttpEntity后文件会给出实现。

3、网络传输中,一般作用utf-8作为默认编码,所以在获取了HttpEntity后,用utf-8编码转换相字符串。

4、使用JSONArray、JSONObject、getJSONArray来获取更新的具体数据,其中getJSONArray中的参数为json对象的名字,我们定义到了UPDATE_KEYS的类中,具体可以参看后文。

5、使用jsonObject.getString,根据json中的每项的key,获取相应的数据,然后赋值到updateItem中,最后形成一个updateItems。

UPDATE_KEYS.java

package com.example.apkupdate;

public class UPDATE_KEYS {
	public final static String ITEMS="Items";
	public final static String NAME="Name";
	public final static String FEATURE_PACKAGE="FeaturePackage";
	public final static String VERSION="Version";
	public final static String URL="Url";
	
}


RequestSp.java

package com.kitsp.httpsp;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.UUID;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class RequestSp {
	private final static int HTTP_200 = 200;

	public static HttpEntity GetHttpEntity(String url) throws Exception {

	
		HttpGet httpGet = new HttpGet(url);

		HttpClient httpClient = new DefaultHttpClient();

		HttpResponse httpResp = httpClient.execute(httpGet);


		if (httpResp.getStatusLine().getStatusCode() == HTTP_200) {
			//Get back data.
			// String result = EntityUtils.toString(httpResp.getEntity(),
			// "UTF-8");
			// return result;
			return httpResp.getEntity();
		} else {
			return null;
		}

	}

}

当然除了使用json来实现数据传输外,也可以使用xml来传输,只是比较麻烦一点。使用xml来传输数据时,需要配合SAX来实现。

在获取了更新列表的数据之后,界面上的更新列表就有内容了。那又要如何实现下载、安装呢?请参见后文Android基于IIS的APK下载(四)数据下载

转载请注明出处Android基于IIS的APK下载(三)用JSON传输更新数据

完整代码在此处下载https://github.com/sparkleDai/ApkUpdate

posted @ 2014-02-25 11:10  _学而时习之  阅读(238)  评论(0编辑  收藏  举报