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

来源:互联网 发布:编程时间和水平成正比 编辑:程序博客网 时间:2024/06/06 07:29

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




1 0
原创粉丝点击