1.接口YunjiaService中
/**
* 下载文件用
* @param fileUrl
* @return
*/
@Streaming //添加这个注解用来下载大文件
@GET()
Call<ResponseBody> downloadFileUrl(@Url String fileUrl);
2.调用
mYunjiaService = retrofit.create(YunjiaService.class);
public void downFile(String url, Callback<ResponseBody> callback) {
try {
if (mYunjiaService == null) {
init();
}
mYunjiaService.downloadFileUrl(url).enqueue(callback);
} catch (Exception e) {
e.printStackTrace();
}
}
3.下载监听
public interface DownloadApkListener {
void onStart();
void onProgress(int p);
void onFinish(String path);
void onError(String msg);
}
4.下载到sd卡相关
/**
* 下载apk
* @param downloadApkListener 下载回调
*/
public void downApkFile(final DownloadApkListener downloadApkListener) {
YunjiaServiceImp.getInstance().downFile(ConstUtil.HOST_APP + ConstUtil.apkURL
,new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
Log.d(TAG, "server contacted and has file");
new Thread(new FileDownloadRun(response,downloadApkListener)).start();
} else {
Log.d(TAG, "server contact failed");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(TAG, "error");
}
});
}
public class FileDownloadRun implements Runnable{
Response<ResponseBody> mResponseBody;
DownloadApkListener mDownloadApkListener;
public FileDownloadRun(Response<ResponseBody> responseBody,
final DownloadApkListener downloadApkListener){
mResponseBody = responseBody;
mDownloadApkListener = downloadApkListener;
}
@Override
public void run() {
writeResponseBodyToDisk(mResponseBody.body(),mDownloadApkListener);
}
}
/**
*
* @param body
* @param downloadListener
* @return
*/
private boolean writeResponseBodyToDisk(ResponseBody body,final DownloadApkListener downloadListener) {
if (downloadListener!=null)
downloadListener.onStart();
try {
// 改成自己需要的存储位置
File file = new File(ConstUtil.dir_appname+ File.separator + "yunjia.apk");
Log.e(TAG,"writeResponseBodyToDisk() file="+file.getPath());
if (file.exists()) {
file.delete();
}
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
inputStream = body.byteStream();
outputStream = new FileOutputStream(file);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
//计算当前下载百分比,并经由回调传出
if (downloadListener!=null)
downloadListener.onProgress((int) (100 * fileSizeDownloaded / fileSize));
Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
}
if (downloadListener!=null)
downloadListener.onFinish(file.getPath());
outputStream.flush();
return true;
} catch (IOException e) {
if (downloadListener!=null)
downloadListener.onError(""+e.getMessage());
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
}