问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用service完成数据下载功能出现的问题

发布网友 发布时间:2023-03-28 20:08

我来回答

1个回答

热心网友 时间:2023-10-29 17:52

   在Android启用service后台下载,使用异步线程进行下载,下载失败时,关掉service。在重新下载时,重新启动service,启动新的异步线程进行下载;因为上一次下载失败只是启动了停止了service,但上一个异步线程任务还在继续运行,此时又有新的线程任务运行,导致两个不同的线程访问同一段代码,导致出错。解决办法是,上一次下载失败时,除了关闭service也要cancel掉异步下载任务的request。

OkHttpClient mOkHttpClient = new OkHttpClient();

// 启动异步线程访问网络
public static void enqueue(Request request, Callback responseCallback, GetCallCancelCallback callback) {
Call call = mOkHttpClient.newCall(request);
callback.getCall(call);
call.enqueue(responseCallback);
}

一下是下载接口,传入下载的URL,存储路径,以及回调。

// 下载接口
public static void download(String downloadUrl, final String distPath, final DownloadCallback callback) {
Request request = new Request.Builder().url(downloadUrl).build();
enqueue(request, new Callback() {
@Override
public void onResponse(Response response) {
if (response.isSuccessful()) {
try {
InputStream is = response.body().byteStream();
long totalSize = response.body().contentLength();
FileOutputStream fos = new FileOutputStream(distPath);
int len = 0;
long downloadSize = 0;
byte[] buffer = new byte[1024 * 8];
while ((len = is.read(buffer)) != -1) {
downloadSize += len;
callback.onDownload(downloadSize, totalSize);
fos.write(buffer, 0, len);
}
if (callback != null) {
callback.onSuccess(null);
return;
}
} catch (IOException e) {
if (callback != null) {
callback.onFail(null);
}
}
}
if (callback != null) {
callback.onFail(null);
}
}

@Override
public void onFailure(Request request, IOException arg1) {
if (callback != null) {
callback.onFail(null);
}
}
}, new GetCallCancelCallback() {
@Override
public void getCall(Call call) {
callback.onGetCall(call); //回调,取得此时的Call
}
});
}

// service中的关键代码
download(url, filePath, new NetUtils.DownloadCallback() {
@Override
public void onSuccess(String result) {

downloadFinish();
}

@Override
public void onDownload(final long downloadSize, final long totalSize) {

mHandler.post(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post(new DownloadProgressEvent(downloadSize / 1024, totalSize / 1024));
}
});
}

@Override
public void onFail(String errorInfo) {
//删掉该文件
LogUtils.error("onDowloadFail", "onDowloadFail");
File file = new File(filePath);
if (file.exists()) {
file.delete();
}

downloadFinish();
}

@Override
public void onTimeout() {

downloadFinish();
}

@Override
public void onGetCall(Call call) {
setCall(call);
}
});

// 关闭service,取消线程中的下载任务
private void downloadFinish() {
mHandler.post(new Runnable() {
@Override
public void run() {
isRunning = false;
LogUtils.error("Service", mCall.toString());
if (mCall != null) {
mCall.cancel(); // 取消当前的request
}
LogUtils.error("Service", "stop");
stopSelf();
}
});
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
私立学校退休有退休金吗 锤子便签排版怎么修改?锤子便签排版的修改方法 锤子便签怎么调整字体 锤子便签APP字体调整方法 锤子便签怎么让字体变大 锤子便签让字体变大方法 苏州新浒花园附近的敬恩实验小学的入学条件,外地农村户口没在苏州买房子... 96年前出生的怎样补办出生证,区计生办说不能补办, 96年以前的出生证叫什么 我的女儿是1995年出身的,请问要补办出身证明该怎么办? 出生证明补办地点在哪办理? 求大师赐教,求高人指点(给我女儿起名) 梦见豆芽菜预示什么 梦见红烧豆芽菜的预兆 好久没运动,昨晚去跑步,今天早上起来大腿各种疼。这种症状要多久才能适应? 练习400米跑的跑步练习多久腿才能不疼? 狂跑步后大腿酸痛几天会好? 坚持每天跑步,大概要多久才能腿不疼 雅诗兰黛精华液的功效 雅诗兰黛精华液好用吗? 奔驰g63蓝牙名称是什么 灵芝百合的功效与作用 小孩的相册的扣扣心情说说情感情绪 如何度过感情倦怠期? 席慕蓉《一棵开花的树》:全诗没一个爱字,却写出最深情热烈的爱 情感微信公众号:weiyulu0812 高中生物呼吸作用手抄报 高中生手抄报 生物小报高中水平手抄报 生物手抄报 清晨起床时经常发生眩晕,脑血栓患者可以吃水蛭素来进行康复吗? 村级安全生产工作方案 杭州一女子结婚找摄影师跟拍,男子主动联系要价,为什么摄影师会选择爽约? 找自由摄影师拍照一般什么价格? 中国第一个性用品是什么? 挨着地的木头怎么锯 油电混动汽车电池寿命一般几年 锯榆木有什么技巧 油电混合车电池可以用多久 油电混合车的电池可以用多长时间 春季踏青的唯美句子 油电混合的车电瓶可以用多长时间 梦见自己喜欢上别人的预兆 梦见自己好像有点喜欢上了别人的预兆 变频空调不接地线可以吗 美的变频空调M180,家里没有地线可以安装使用吗? 想买台变频空调,可是家里没接地线,可不可以装啊?有没有人没地线也装了变频空调? 变频空调没有地线是不是就不能工作有人说什么假变频和真变频说假变频空调没接地线就不能工作是这样的吗 海尔空调ptc电热电流多少安 武功县农村信用合作联社人民路分社怎么样? 罗技和不得不爱哪个好 移动5G套餐每月多少钱? 西门子洗衣机通电后没反应 风筝提线怎么绑图解