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被关闭后再重新启动

--------------------------------------------------------------------------- 转载:http://blog.csdn.net...

Android中让Service被关闭后再重新启动

转自:http://blog.csdn.net/rex_amaker/article/details/7049039 如何做到开机启动? 只要实现一个BroadcastReceiver,监听手...

开发一个后台service,每隔1秒输出系统时间,并可重新启动或停止服务

activity_main.xml

监听后台Service是否被Kill并重新启动Service

在这篇文章中,我们会用到一个系统广播---系统时钟广播,即Intent.ACTION_TIME_TICK,在说之前,我们先了解下这个广播的情况,看文档上说的: 在众多的Intent的action动...

Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充

开门见山 第一种 第二种 第三种 总结开门见山开启服务有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定。 具体的启动情况有下: ①调用startServic...

Android游戏和应用开发中强制横竖屏引起的程序重新启动问题

这两天碰到一个崩溃的问题 程序运行时按电源键会导致程序重新启动,这个问题非常严重了   到DevDiv发帖问,被版主点拨,说可能是横竖屏引起,立马测试了一下 果然是的 屏幕会自动切换时,默认...
  • kbest
  • kbest
  • 2011年11月06日 21:33
  • 1198

整合IIS和Tomcat出现问题,原网站打不开,出现Service Unavailable 解决办法!!

有几种可能:  一、 如果出现“Service Unavailable”的提示,刷新几下又可以访问。  出现这种情况是由于您的网站超过了iis限制造成的。由于2003的操作系统在提示IIS过多时并...
  • zndxlxm
  • zndxlxm
  • 2012年04月04日 13:57
  • 1175

SQL server 2008 安装时 安装程序支持规则“重新启动计算机”失败解决方法

1.时间:2017-05-09 20:30  YuanMxy 2.问题描述:SQL server 2008 安装时 安装程序支持规则“重新启动计算机”失败。   3.出现原因:注册表Pendi...
  • YuanMxy
  • YuanMxy
  • 2017年05月09日 21:32
  • 2904

在SSIS包中使用 Checkpoint从失败处重新启动包

使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间。   ...

安装SQL SERVER 2008时提示“重新启动计算机失败”解决方法

安装SQL SERVER 2008时提示“重新启动计算机失败”解决方法     最近在一台windows 2003服务器上安装SQL Server 2008,安装到“安装程序支持规则”步骤,有一个错...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android启动service下载失败后stopService,重新启动service下载出现问题
举报原因:
原因补充:

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