当前位置:操作系统 > 安卓/Android >>

Android--使用Http向服务器发送请求并取得返回结果,下载图片

由于最近在做的一个游戏项目有一个排行榜,
 
排行榜是一个列表,界面大致如下:
 
 
 
排名     人物名称     头像图片     分数
 
排名     人物名称     头像图片     分数
 
排名     人物名称     头像图片     分数
 
排名     人物名称     头像图片     分数
 
排名     人物名称     头像图片     分数
 
排名     人物名称     头像图片     分数
 
 
 
排行     人物名称     头像图片     分数
 
 
 
列表中有100条数据,列表下面有一个
 
控件显示游戏玩家自己的排名信息
 
 
 
需求如下:
 
每次进入排行榜界面,则将游戏玩家的
 
人物名称和分数提交到服务端,服务端
 
接收请求后对数据库中的数据进行排序,
 
取得前100名的数据,还有一条游戏玩家
 
的数据,总共101条数据,由于客户端
 
还需要下载头像图片,所以返回的数据
 
还有头像图片的下载地址,服务端将所有
 
的数据包装成一个Json数据返回给客户端
 
大致格式如下:
{"rank":
[
{"person":"\u66f9\u64cd","index":1,"score":35852},
{"person":"\u66f9\u64cd","index":2,"score":32563},
{"person":"\u5b59\u6743","index":3,"score":10000},
{"person":"\u5218\u5907","index":4,"score":9638},
{"person":"\u5218\u5907","index":5,"score":8888},
{"person":"\u5b59\u6743","index":6,"score":8886},
{"person":"\u5218\u5907","index":7,"score":7865},
{"person":"\u5218\u5907","index":8,"score":6950},
{"person":"\u5218\u5907","index":9,"score":6548},
{"person":"\u5218\u5907","index":10,"score":6540},
{"person":"\u66f9\u64cd","index":11,"score":5288}
],


"base":"(服务端地址)",

"head":
[
{"person":"\u66f9\u64cd","filename":"\/caocao\/20130718185726036.png", "size":12343},

{"person":"\u5b59\u6743","filename":"\/sunqun\/20130718185726046.png", "size":12343},

{"person":"\u5218\u5907","filename":"\/liubei\/20130718185726056.png", "size":12343}
]
}

 

rank的每个对象包括:人物名称,排名,分数
 
head的每个对象包括:人物名称,头像图片名称
 
base为服务端地址
 
 
 
大致流程如下:
 
1.进入排行榜界面,将游戏玩家的数据发送到服务端
 
2.取得服务端返回的Json数据,解析出rank数组,head数组和base字符串
 
3.使用头像图片路径下载头像图片到本地
 
4.新建一个ResultMessage类,属性包括:排名,人物名称,本地头像图片地址,分数
 
5.在解析rank数组时实例化ResultMessage,添加到List中并返回出去
 
 
 
主要有三个类:LoadImage.java,ResultMessage.java,Upload.java
 
 
 
LoadImage.java用于下载头像图片,由于每次进入排行榜界面都会向
 
服务端发送请求,每次都会返回头像图片的下载地址,所以需要
 
做下判断本地是否已经有此图片存在,还有就是判断图片大小是否
 
正确,因为会有这样一种情况,在下载图片时突然网络断开,这时
 
头像图片没有下载完整,下次进入排行榜界面的时候又向服务端
 
发送请求,又下载头像图片,此时程序判断出本地已经有此图片
 
存在,所以不会再下载图片,但是图片不完整,无易做图常使用,
 
所以除了判断本地是否有图片之外,还需要判断图片的大小是不是
 
跟服务端发过来的大小一样,只有图片存在,并且大小一样的时候
 
才不下载图片
 
 
 
具体代码如下:
package com.joye3g.http;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.http.HttpStatus;

public class LoadImage {

	private static final int SUCCES = 1;//下载成功
	private static final int ERRO = -1;//下载失败
	private static final int EXIST = 0;//文件已存在
	private static int result = EXIST;//返回的下载结果
	private String localPath;//本地路径
	
	public LoadImage(String localPath) {
		this.localPath = localPath;
	}

	/**
	 * @param urlPathPrefix       网址前缀
	 * @param filename            文件名
	 * @param size                文件大小
	 * @return
	 * @throws IOException
	 */
	public int download(String urlPathPrefix, String filename, long size) throws IOException{
		String filePath = localPath + File.separator + filename.substring(filename.lastIndexOf("/") + 1);
		//判断filePath路径下有没有此图片存在,大小是否相同,如果不存在,则发送Http请求下载图片,存在则不下载
		if(isFileExist(filePath) && isSizeSame(filePath, size)){
			return result = EXIST;
		}else{
			//从URL中取得输入流
			InputStream is = getHttpInputStream(urlPathPrefix + filename);
			//创建新文件
			File file = createFile(filePath);
			//下载图片
			if(is != null) downLoadImage(file, is);  
		}
		return result;
	}

	/**
	 * 下载图片
	 * @param file  文件
	 * @param is	从URL取得的输入流
	 */
	private void downLoadImage(File file, InputStream is){
		FileOutputStream fs = null;
		try {
			fs = new FileOutputStream(file);
			byte[] buffer = new byte[4 * 1024];
			int len = 0;
			while((len = is.read(buffer)) != -1){
				fs.write(buffer, 0, len);
			}
			fs.flush();
			result = SUCCES;
		} catch (Exception e) {
			result = ERRO;
			e.printStackTrace();
		}finally{
			try {
				if(fs != null){
					fs.close();
				}
				if(is != null){
					is.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据URL取得输入流
	 * @param urlPath   网络路径
	 * @return
	 * @throws IOException
	 */
	private InputStream getHttpInputStream(String urlPath) throws IOException{
		URL url = new URL(urlPath);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		if(conn.getResponseCode() == HttpStatus.SC_OK) {
			return conn.getInputStream();
		}
		return null;
	}

	/**
	 * 判断文件是否已经存在
	 * @param fileName     文件路径
	 * @return
	 */
	private boolean isFileExist(String fileName){
		File file = new File(fileName);
		return file.exists();
	}

	/**
	 * 在指定路径下创建新文件
	 * @param fileName      文件路径
	 * @return
	 * @throws IOException
	 */
	private File createFile(String fileName) throws IOException{
		File file = new File(fileName);
		if(!file.createNewFile()){
			file.delete();
			file.createNewFile();
		}
		return file;
	}
	
	/**
	 * 若文件已存在,判断文件大小是否正确
	 * @param filePath         图片路径
	 * @param size             文件大小
	 * @return
	 */
	private boolean isSizeSa
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,