zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    fetch jsonp请求接口
    mysql explain执行计划详解
    MySQL主从复制与读写分离 --非原创
    C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限
    Mysql有没有语法可以在增加列前进行判断该列是否存在
    .net4.0注册到IIS ,重新注册IIS ,iis注册
    C#操作IIS程序池及站点的创建配置
    .net C# 对虚拟目录IIS的操作
    I​n​n​o​ ​s​e​t​u​p​ ​常​用​修​改​技​巧
    innosetup语法详解
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605038.html
Copyright © 2011-2022 走看看