import android.os.Environment;
import android.support.annotation.NonNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by cowork16 on 2017/9/3.
*/
public class DownloadUtil {
private static DownloadUtil downloadUtil;
private final OkHttpClient okHttpClient;
public String filePath;
public static DownloadUtil get() {
if (downloadUtil == null) {
downloadUtil = new DownloadUtil();
}
return downloadUtil;
}
private DownloadUtil() {
okHttpClient = new OkHttpClient();
}
/**
* @param url 下載連接
* @param saveDir 儲(chǔ)存下載文件的SDCard目錄
* @param listener 下載監(jiān)聽(tīng)
*/
public void download(final String url, final String saveDir, final OnDownloadListener listener) {
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 下載失敗
listener.onDownloadFailed();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = null;
// 儲(chǔ)存下載文件的目錄
String savePath = isExistDir(saveDir);
try {
is = response.body().byteStream();
long total = response.body().contentLength();
File file = new File(savePath, getNameFromUrl(url));
if (file.exists()){
file.delete();
}
filePath = file.getPath();
System.out.print(filePath);
if(file.exists()){
file.delete();
}
fos = new FileOutputStream(file);
long sum = 0;
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
sum += len;
int progress = (int) (sum * 1.0f / total * 100);
// 下載中
listener.onDownloading(progress);
}
fos.flush();
// 下載完成
listener.onDownloadSuccess();
} catch (Exception e) {
listener.onDownloadFailed();
} finally {
try {
if (is != null)
is.close();
} catch (IOException e) {
}
try {
if (fos != null)
fos.close();
} catch (IOException e) {
}
}
}
});
}
/**
* @param saveDir
* @return
* @throws IOException
* 判斷下載目錄是否存在
*/
private String isExistDir(String saveDir) throws IOException {
// 下載位置
File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
if (!downloadFile.mkdirs()) {
downloadFile.createNewFile();
}
String savePath = downloadFile.getAbsolutePath();
return savePath;
}
/**
* @param url
* @return
* 從下載連接中解析出文件名
*/
@NonNull
private String getNameFromUrl(String url) {
return url.substring(url.lastIndexOf("/") + 1);
}
public interface OnDownloadListener {
/**
* 下載成功
*/
void onDownloadSuccess();
/**
* @param progress
* 下載進(jìn)度
*/
void onDownloading(int progress);
/**
* 下載失敗
*/
void onDownloadFailed();
}
}
工具類——OkHttp下載進(jìn)度監(jiān)聽(tīng)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)淹冰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)库车,“玉大人,你說(shuō)我怎么就攤上這事樱拴∧埽” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵疹鳄,是天一觀的道長(zhǎng)拧略。 經(jīng)常有香客問(wèn)我芦岂,道長(zhǎng)瘪弓,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任禽最,我火速辦了婚禮腺怯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘川无。我一直安慰自己呛占,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布懦趋。 她就那樣靜靜地躺著晾虑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仅叫。 梳的紋絲不亂的頭發(fā)上帜篇,一...
- 那天,我揣著相機(jī)與錄音诫咱,去河邊找鬼笙隙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坎缭,可吹牛的內(nèi)容都是我干的竟痰。 我是一名探鬼主播,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼掏呼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坏快!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起憎夷,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奋构,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后澜公,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡臼予,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啃沪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粘拾。...
- 正文 年R本政府宣布械哟,位于F島的核電站,受9級(jí)特大地震影響殿雪,放射性物質(zhì)發(fā)生泄漏暇咆。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一丙曙、第九天 我趴在偏房一處隱蔽的房頂上張望爸业。 院中可真熱鬧,春花似錦亏镰、人聲如沸扯旷。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钧忽。三九已至,卻和暖如春逼肯,著一層夾襖步出監(jiān)牢的瞬間耸黑,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓洲拇,卻偏偏與公主長(zhǎng)得像奈揍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赋续,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- OkHttpPlus介紹 項(xiàng)目地址:https://github.com/ZhaoKaiQiang/OkHttpP...
- 前幾天自己寫(xiě)了一個(gè)OkHttp的封裝 因?yàn)樽约涸陧?xiàng)目中有用到,包括post請(qǐng)求顽爹,自定義接口UI更新纤泵,上傳下載進(jìn)度顯...
- 說(shuō)在前面 要實(shí)現(xiàn)進(jìn)度的監(jiān)聽(tīng),需要使用到OkHttp的依賴包Okio里的兩個(gè)類镜粤,一個(gè)是Source捏题,一個(gè)是Si...
- 世界上最遙遠(yuǎn)的距離是我們坐在一起公荧,你卻在看手機(jī)。 是什么時(shí)候開(kāi)始同规,我們不再面對(duì)面循狰,我們習(xí)慣性看著發(fā)光的屏幕,你關(guān)心...
- 老豚曾經(jīng)說(shuō)過(guò)自己對(duì)微商的理解就是:微信上做生意捻浦。從某種意義上來(lái)說(shuō)晤揣,老豚自己也算是微商桥爽,所以朱灿,老豚的微信好友基本除了...