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} ] }
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 ,