在《Android基於IIS的APK下載(二)顯示更新列表》一文中已經在界面中顯示了更新列表,那這個更新列表的數據是如何來的呢?咱們看到UpdateItemsAdapter的構造函數中傳入了一個updateItems的參數,這就是更新列表的數據,因此咱們如今的關鍵就是獲取updateItems。javascript
因爲咱們是基於網絡傳輸數據的,那網絡中數據傳輸主要有哪此呢?比較經常使用的有json、xml。在量級上,json又比xml更加輕量,並且java中有相應的庫支持json的解析,因此考慮使用json來實現。css
要從網絡中獲取數據,確定要發起請求,因此要有相應的url。在發起請求後,必需要有服務器來響應,因此必需要有相應的服務器。這裏咱們用IIS來做爲服務器,後續的文章中會做一些講解。假定同在已經架設好了IIS服務器,而且在MIME中添加了json格式文件的支持,如今咱們就能夠發起請求了。下面是實現的代碼。java
UpdateLoader.java
android
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; } } }
一、獲取新更列表的url,默認爲http://192.168.1.5:9000/update.json.其中http://192.168.1.5:9000爲服務器的地址,update.json爲更新列表的具體數據文件。git
二、RequestSp.GetHttpEntity後文件會給出實現。github
三、網絡傳輸中,通常做用utf-8做爲默認編碼,因此在獲取了HttpEntity後,用utf-8編碼轉換相字符串。apache
四、使用JSONArray、JSONObject、getJSONArray來獲取更新的具體數據,其中getJSONArray中的參數爲json對象的名字,咱們定義到了UPDATE_KEYS的類中,具體能夠參看後文。json
五、使用jsonObject.getString,根據json中的每項的key,獲取相應的數據,而後賦值到updateItem中,最後造成一個updateItems。服務器
UPDATE_KEYS.java
markdown
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"; }
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; } } }
在獲取了更新列表的數據以後,界面上的更新列表就有內容了。那又要如何實現下載、安裝呢?請參見後文Android基於IIS的APK下載(四)數據下載