Android启动service下载失败后stopService,重新启动service下载出现问题

原创 2016年08月31日 14:54:08

   在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();
            }
        });

    }






版权声明:本文为博主原创文章,未经博主允许不得转载。

android Service的启动方式和重复绑定

重复绑定的条件: onUnbind(Intent intent);方法返回值为true. 服务中没有onDestroy();方法。...
  • jeff2016yang
  • jeff2016yang
  • 2016年05月21日 10:08
  • 338

Android_Service多线程断点下载

Android中实现单线程下载文件是比较容易的,可是要使得自己的应用支持多线程断点下载就要考虑到很多细节了,今天我们一起来探讨一下多线程断点下载时怎么实现的。 首先先画一张图说明一下Androi...
  • GePriniusce
  • GePriniusce
  • 2016年07月21日 17:25
  • 991

Android-Service系列之断点续传下载

PS:本文代码来自慕课网同名课程Android-Service系列之断点续传下载,这里只是为了Mark下来方便自己以后使用。 首先是布局文件,因为只是demo,所以使用图形化工具生成。 ...
  • u013983998
  • u013983998
  • 2015年06月03日 23:33
  • 1170

Android实现Service下载文件,Notification显示下载进度

先放个gif。。最终效果如果: 主要演示了android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真...
  • yaochangliang159
  • yaochangliang159
  • 2016年05月28日 22:02
  • 5817

Android Service下载文件并自定义通知提示下载

最近要做一个更新sdk,里面用到了service后台下载,自定义通知提示下载进度,下面直接贴上代码. 下面是UpdateUtils.java ,告诉你如何使用 package com.cnzi...
  • yan1348
  • yan1348
  • 2016年08月09日 11:07
  • 934

Android中服务的开启和停止的方式以及各种情况下的存活状态

服务是我们在Android开发中很常见的一个组件,号称那个啥?四大组建之一对吧,嘿嘿,没记错哈。今天小金子要说的不只是开启单一的开启服务和停止服务方法的使用,还要混合使用这几个方法,并且记录下来!  ...
  • u011692041
  • u011692041
  • 2015年11月16日 19:41
  • 5411

Android通过后台service下载

首先介绍一下这个dome:通过service下载Word文档;当然你也可以使用我这个dome下载其他文件类型;代码中有注释修改文件类型即可。 为了方便大家快速引入项目,下面介绍下目录: 那么我们导入文...
  • yanxuxu123
  • yanxuxu123
  • 2016年12月26日 17:16
  • 1234

关于Android中的四大组件(Service的开启与关闭)

前言 服务(Service)是Android系统中的四大组件之一。服务主要用于两个目的:后台运行和跨进程访问。通过启动 一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用...
  • GULINHAI12
  • GULINHAI12
  • 2015年08月17日 13:53
  • 8889

Android之Service学习篇一:Service启动方式之startService

Service概念及用途: A service is an application component that can perform long-running operations in t...
  • wulianghuan
  • wulianghuan
  • 2013年02月20日 23:57
  • 99720

linux系统下使用service方式启动Tomcat

如果需要将tomcat作为linux的后台程序运行,需要使用commons-daemon工程的jsvc工具,tomcat的bin目录里已经自带了这个工具的源码。操作环境:centos 7,Tomcat...
  • wangchenglong89
  • wangchenglong89
  • 2017年03月01日 16:22
  • 1942
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android启动service下载失败后stopService,重新启动service下载出现问题
举报原因:
原因补充:

(最多只允许输入30个字)