xUtils有四大常用的功能,这里我为大家介绍HttpUtils的下载和上传。
第一步:从github上面下载xUtils.jar包。[链接](https://github.com/wyouflf/xUtils/)。下载完成之后放到自己建的项目libs目录下,如果没有就创建一个。然后在清单文件里面添加权限,在上面链接页面就有说明,复制粘贴即可。至此,前期准备工作已经完成。
第二步:下载链接页面也有xUtils的介绍,或许大家不知道具体每个方法是什么意思,我这里为大家介绍下载和上传文件常用的方法。
第三步:上传文件。在自己的项目创建如下方法,方法名,参数自己设置,方法里面的代码才是主要代码
public void photoUpload(String host, String token, String path) {
HttpUtils utils = new HttpUtils(50000);
String uploadHost = host;
RequestParams params = new RequestParams();
params.addHeader("token", token);
File file = new File(path);
params.addBodyParameter("file", file, MIME.ENC_BINARY);
utils.send(HttpMethod.POST, uploadHost, params,
new RequestCallBack() {
@Override
public void onStart() {
super.onStart();
Toast.makeText(MainActivity.this, "开始上传",
Toast.LENGTH_LONG).show();
}
@Override
public void onLoading(long total, long current,
boolean isUploading) {
super.onLoading(total, current, isUploading);
System.out.println(current + "/" + total);
}
@Override
public void onSuccess(ResponseInfo arg0) {
Toast.makeText(MainActivity.this, "上传成功",
Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(HttpException arg0, String arg1) {
System.out.println(arg0 + ":" + arg1);
Toast.makeText(MainActivity.this, arg1,
Toast.LENGTH_LONG).show();
}
});
}
服务器一般有返回参数,返回的参数在onSuccess()方法的参数里面,debug或者打印一下arg0的内容就可以了,arg0.result就是返回结果的字符串,打印出来查看,然后根据你们的要求获取就可以了。
第四步:下载文件。
public void download() {
// 判断是否有SD卡
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
long availableSize = Utils.IO.availableSize();
int downloadLength = downloadFileSize(url);
//判断手机内存是否够下载文件
if (availableSize >= downloadLength) {
HttpUtils utils = new HttpUtils();
String target = Environment.getDataDirectory()
+ "/data/应用的包名/download/" + nameChapter
+ ".mp3";
handlerDownload = utils.download(url, target, true, true,
new RequestCallBack() {
@Override
public void onStart() {
super.onStart();
Toast.makeText(context, "开始下载",
Toast.LENGTH_SHORT).show();
}
@Override
public void onLoading(long total, long current,
boolean isUploading) {
super.onLoading(total, current, isUploading);
System.out.println(current + "/" + total);
@Override
public void onSuccess(ResponseInfo arg0) {
Toast.makeText(context, "下载成功",
Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(HttpException arg0,
String arg1) {
Toast.makeText(context, "下载失败",
Toast.LENGTH_SHORT).show();
}
});
}
} else {
Toast.makeText(context, "请先插入SD卡", Toast.LENGTH_SHORT).show();
}
}
从网上下载东西一般都有两个判断,一、判断手机有没有装SD卡。二、判断手机内存够不够用。这里我给出了两个工具类:判断手机可用内存的方法。如下:
/**
* 获取手机剩余内存大小
*
* @return 手机剩余内存(单位:byte)
*/
public static long availableSize() {
// 取得SD卡文件路径
File file = Environment.getExternalStorageDirectory();
StatFs fs = new StatFs(file.getPath());
// 获取单个数据块的大小(Byte)
int blockSize = fs.getBlockSize();
// 空闲的数据块的数量
long availableBlocks = fs.getAvailableBlocks();
return blockSize * availableBlocks;
}
注释已经写的很清楚了。然后判断网络文件大小的方法。如下:
/**
* 获取网络文件大小
*
* @param path
* 文件链接
* @return 文件大小
*/
public int downloadFileSize(final String path) {
new Thread() {
public void run() {
try {
URL url = new URL(path); //创建url对象
HttpURLConnection conn = (HttpURLConnection) url
.openConnection(); //建立连接
conn.setRequestMethod("GET"); //设置请求方法
conn.setReadTimeout(5000); //设置响应超时时间
conn.setConnectTimeout(5000); //设置连接超时时间
conn.connect(); //发送请求
int responseCode = conn.getResponseCode(); //获取响应码
if (responseCode == 200) { //响应码是200(固定值)就是连接成功,否者就连接失败
length = conn.getContentLength(); //获取文件的大小
} else {
Toast.makeText(context, "连接失败", Toast.LENGTH_LONG)
.show();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
return length;
}
这个,我跟人觉得也没有什么好说的,注释也很清楚。言归正传,我们上面的下载方法,首先由两个if语句,一个是判断是否手机装有SD卡,一个是判断手机剩余空间是否大于要下载文件的大小。然后就是剩下的那个主要方法了,那个才是下载文件的方法。这里我们会碰到好几个方法,因为不知道参数的意思而不会选择,这里我给出两个方法的用处:
三个参数的方法:
utils.download(url, target, callback);
参数一:要下载网络文件的url链接
参数二 : 要保存在手机的位置
参数三:回调方法,没什么好说的,几个方法都一样的
五个参数的方法:
utils.download(url, target, autoResume, autoRename, callback);
参数一:要下载网络文件的url链接
参数二:要保存在手机的位置
参数三:是否自动恢复下载(即支持断点下载)
参数四:是否重命名
参数五:回调方法
当不需要支持断点下载的时候就用三个参数的方法,当需要支持断点下载的时候就用五个参数的那个。怎么样才能暂停呢?其实很简单,就一个方法;handlerDownload.cancel();这样就暂停了,对象handlerDownload,请仔细看前面download方法。以上就是全部内容。有可能有很多朋友会碰到手机存储的问题,我这里再给出几个SD卡存储路径吧。
SD卡存储:
Environment.getDataDirectory(): /data
Environment.getRootDirectory(): /system
Environment.getDownloadCacheDirectory(): /cache
Environment.getExternalStorageDirectory(): /storage/emulated/0
比方说,我们要获取我们自己的应用的路径,应用一般都是安装再data/data目录下面
Environment.getDataDirectory(): +"/data/应用的包名/download/"
上面这个的意思就是把下载的文件保存在我们应用的download目录下面,如果没有download目录,会新建一个download目录。然后路径后面还要加上我们要保存的文件的名字。
至此,我要说的全部说完了。后面陆续会发表数据库操作方面的内容。