HttpClient||HttpURLConnection下载apk

HttpClient方式下载apk文件:

private int downloadUpdateFile(String downloadUrl){
			int count = 0;
			long totalSize = 0;
			long downloadSize = 0;
			URI uri = null;
			
			HttpGet httpGet = null;
			try{
				uri = new URI(downloadUrl);
				httpGet = new HttpGet(uri);
			}catch(URISyntaxException e){
				String encodeUrl = downloadUrl.replace(' ', '+');
				httpGet = new HttpGet(encodeUrl);
				e.printStackTrace();
			}
			
			HttpClient httpClient = new DefaultHttpClient();
			HttpResponse httpResponse = null;
			FileOutputStream fos = null;
			InputStream in = null;
			try{
				httpResponse = httpClient.execute(httpGet);
				if(httpResponse != null){
					int stateCode = httpResponse.getStatusLine().getStatusCode();
					if(stateCode == HttpStatus.SC_OK){
						HttpEntity entity = httpResponse.getEntity();
						if(entity != null){
							totalSize = entity.getContentLength();//获取总大小
							int step = (int) (totalSize/1024/100);
							//判断内存可用
							if(memoryAvailable(totalSize)){
								in  = entity.getContent();
								if(in != null){
									fos = new FileOutputStream(updateFile,false);//updateFile是创建的apk要保存的文件file路径
									byte buffer[] = new byte[1024];
									int readsize = 0;
									while((readsize = in.read(buffer))>0){
										fos.write(buffer,0,readsize);
										downloadSize +=readsize;
										count +=1;
										if(count==step){
											publishProgress(count);//更新界面(AsyncTask)
											count = 0;
										}
									}
									fos.flush();
									if(totalSize>=downloadSize){
										return DOWNLOAD_COMPLETE;
									}else{
										return DOWNLOAD_FAIL;
									}
								}
							}
							else{
								if(httpGet != null){
									httpGet.abort();
								}
								return DOWNLOAD_NOMEMORY;
							}
						}
					}
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				try{
					if(fos != null){
						fos.close();
					}
					if(in != null){
						in.close();
					}
				}catch(IOException e){
					e.printStackTrace();
				}
				if(httpClient !=null){
					httpClient.getConnectionManager().shutdown();
				}
			}
			return DOWNLOAD_FAIL;
		}
// 判断内存
private boolean memoryAvailable(long fileSize){
			fileSize += (1024<<10);
			ActivityManager am = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
			MemoryInfo mi = new MemoryInfo();
			am.getMemoryInfo(mi);
			long l =  mi.availMem;
			if(l>fileSize){
				createFile();//创建要保存的地址文件的方法
				return true;
			}else{
				return false;
			}
		}
********************************************************************************************************************

HttpURLConnection下载apk

private int downloadFileURLConnection(String appurl){
			byte[] getData;
			InputStream inputStream = null;
	        createFile();//创建文件路径的方法
	        FileOutputStream fos;
			try {
				URL url = new URL(appurl);  
		        HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
		        //设置超时间为3秒  
		        conn.setConnectTimeout(3 * 1000);   
		        conn.setRequestProperty("Accept-Encoding", "identity");//不设置会有中文乱码情况
		        int total = conn.getContentLength();//获取总大小
		        //得到输入流  
		        inputStream = conn.getInputStream();  
		        //获取自己数组  
		        getData = readInputStream(inputStream,total);  
				fos = new FileOutputStream(updateFile);//updateFile创建的apk文件路径(是File对象类型)
				fos.write(getData);  
		        if (fos != null) {  
		            fos.close();  
		        }  
		        if (inputStream != null) {  
		            inputStream.close();  
		        } 
		        return DOWNLOAD_COMPLETE;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}  
	         return DOWNLOAD_FAIL;
		}
//流转换成byte数组
public  byte[] readInputStream(InputStream inputStream,int total) throws IOException {
		int step = (int) Math.ceil(total/1024/100);
	        byte[] buffer = new byte[1024];  
	        int len = 0;  
	        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	        while ((len = inputStream.read(buffer)) != -1) {  
	            bos.write(buffer, 0, len);  
	            count +=1;
		 if(count==step){
		  publishProgress(count);//更新界面(AsyncTask)
		  count = 0;
		 }
	        }  
	        bos.close();  
	        return bos.toByteArray();  
	    }  


两种方法都写在了继承AsyncTask的类里,所以可以直接调用publishProgress()方法更新加载进度界面。

**************************************************************************************************************

网络获取.json后缀文件:

private static String updateCheckUrl = "http://192.168.1.199:8081/update.json";
try{
	URL url = new URL(updateCheckUrl);
	HttpURLConnection conn = (HttpURLConnection) url.openConnection();
	conn.setRequestProperty("contentType", "GBK");
	conn.setConnectTimeout(10*1000);
	conn.setRequestMethod("POST");
							
	int code = conn.getResponseCode();
	if(code == 200){
	 InputStream inputStream = conn.getInputStream();
	 String result = MyUtils.streamToString(inputStream);
	 JSONObject object = new JSONObject(result);
	 int newCode = object.getInt("serverFlag");//获取.json文件中json数据的方式
	 //其他逻辑操作。。。
	 handler.sendEmptyMessage(SUCCESS);
	}else{
	 handler.sendEmptyMessage(FAIL);
	}						
	 }
	}catch(Exception e){
	 e.printStackTrace();
	 handler.sendEmptyMessage(EXC);
	}


网络请求是耗时操作,代码是在子线程中执行的。




猜你喜欢

转载自blog.csdn.net/aianzxy/article/details/79232235