在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. 【总结问题】在Eclipse中安装ADT(Android(安卓)Development Tool
  2. 应用在华为P9手机上安装失败原因分析 (错误码:-110)
  3. Android源码学习之环境搭建(Ubuntu下载Android源码)
  4. Android之Handler:实现计时器实例
  5. Android中线程同步
  6. Android开发——消息处理传递机制
  7. 【Android】Handler 中 Looper 死循环为什么不会导致应用卡死的
  8. Android中AsyncTask的简单总结
  9. 提高Android应用程序的速度四大原则

随机推荐

  1. Android人脸识别技术
  2. android anr导出崩溃文件
  3. Android硬件访问服务-Service
  4. Android中横竖屏、全屏、无标题设置
  5. 2010.11.27———android 展示网络上的图
  6. Android中的集中常用布局方式和按钮事件
  7. LayoutAnimation
  8. 在Android上执行Java程序
  9. Android创建自定义键盘
  10. zxing项目源码解读(2.3.0版本,Android部分)