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 = "https://192.168.1.5:9000/update.json";

	@SuppressWarnings("finally")
	public List AnalyUpdate() {
		List 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();
			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,默認為https://192.168.1.5:9000/update.json.其中https://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

發佈留言