当前位置: 首页 > news >正文

宁国市网站建设wordpress注册未发邮件

宁国市网站建设,wordpress注册未发邮件,网站工作室 需要什么手续,成都建设网站专业公司OKHTTP断点续传 文章目录 OKHTTP断点续传HTTP断点续传知识点RangeContent RangeEtagIf-Range#xff08;文件唯一标志#xff09; OKHTTP断点下载OKHTTP 简单短断点下载代码示例 Android 断点续传一直是面试的高频问点#xff0c;这里从HTTP断点续传知识和Android续传思…OKHTTP断点续传 文章目录 OKHTTP断点续传HTTP断点续传知识点RangeContent RangeEtagIf-Range文件唯一标志 OKHTTP断点下载OKHTTP 简单短断点下载代码示例 Android 断点续传一直是面试的高频问点这里从HTTP断点续传知识和Android续传思路结合一起总结出关于Android断点续传做法。 HTTP断点续传知识点 HTTP1.1 协议中默认支持获取文件的部分内容主要是通过头部两个参数Range和Content Range 来实现的客户端发送请求是对应是Range 服务器响应时是对应Content-Range。 Range 是客户端想要获取文件的部分内容的关键字段Range 参数中指定获取内容的起始字节的位置和终止字节的位置。他的一般格式为 font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);Range:(unitfirst byte /font**font stylecolor:rgb(51, 51, 51);pos/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);)-[/font**font stylecolor:rgb(51, 51, 51);last/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248); byte /font**font stylecolor:rgb(51, 51, 51);pos/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);]/font 例如 Range: bytes0-499 表示第 0-499 字节范围的内容 、 Range: bytes-500 表示最后 500 字节的内容 Range: bytes500- 表示从第 500 字节开始到文件结束部分的内容 Range: bytes0-0,-1 表示第一个和最后一个字节 Range: bytes500-600,601-999 同时指定几个范围Content Range 在接受到客户端的Range请求后服务器会在响应的头部添加Content 参数返回可以接受的文件字节范围和文件的总大小他们格式如下 font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);Content-Range: bytes (unit first byte /font**font stylecolor:rgb(51, 51, 51);pos/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);) - [/font**font stylecolor:rgb(51, 51, 51);last/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248); byte /font**font stylecolor:rgb(51, 51, 51);pos/font**font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);]/[entity legth]/font 例如 font stylecolor:navy;Content-Range/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);: bytes /fontfont stylecolor:teal;0/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);-/fontfont stylecolor:teal;499/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);//fontfont stylecolor:teal;22400/font_font stylecolor:rgb(153, 153, 136);// 0499 是指当前发送的数据的范围而 22400 则是文件的总大小。/font_ 不使用文件断点续传响应体内容font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);HTTP//fontfont stylecolor:teal;1.1200Ok/font 使用文件断点续传响应体的内容font stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248);HTTP//fontfont stylecolor:teal;1.1206/fontfont stylecolor:rgb(51, 51, 51);background-color:rgb(248, 248, 248); Partial /fontfont stylecolor:navy;Content/font 服务器文件发生变化会导致续传的请求是肯定是失败的为了处理这种服务器文件资源发生改变的问题在RFC2616中定义了Last-Modified和Etag来判断文件资源是否发生改变。 EtagIf-Range文件唯一标志 Etag作为文件唯一的标志这个标志可以是文件的hash值或者是一个版本If-Range用于判断实体是否发生改变如果未改变服务器发送客户端丢失的部分否则发送整个实体一般格式为If-Range: Etag | HTTP-Date If-Range可以使用Etag或者Last-Modified返回的值当没有ETag却有Last-Modified时可以把Last-Modified作为If-Range的值验证过程 step1客户端发起续传请求头部包含Range和If-Range参数step2服务器中收到客户端的请求之后将客户端与服务器的Etag进行对比 相等请求文件资源没有发生变化应答报文是206不相等请求文件资源发生变化应答报文为200 OKHTTP断点下载 step 1判断检查本地是否有下载文件若存在则获取已下载的文件大小 downloadLength若不存在那么本地已下载文件的长度为 0step 2获取将要下载的文件总大小HTTP 响应头部的 content-Length)step 3比对已下载文件大小和将要下载的文件总大小contentLength判断要下载的长度step 4再即将发起下载请求的 HTTP 头部中添加即将下载的文件大小范围Range: bytes downloadLength - contentLength) OKHTTP 简单短断点下载代码示例 /*** String 在执行AsyncTask时需要传入的参数可用于在后台任务中使用。* Integer 后台任务执行时如果需要在界面上显示当前的进度则使用这里指定的泛型作为进度单位。* Integer 当任务执行完毕后如果需要对结果进行返回则使用这里指定的泛型作为返回值类型。*/ public class DownloadTask extends AsyncTaskString, Integer, Integer {public static final int TYPE_SUCCESS 0;public static final int TYPE_FAILED 1;public static final int TYPE_PAUSED 2;public static final int TYPE_CANCELED 3;private DownloadListener listener;private boolean isCanceled false;private boolean isPaused false;private int lastProgress;public DownloadTask(DownloadListener listener) {this.listener listener;}/*** 这个方法中的所有代码都会在子线程中运行我们应该在这里处理所有的耗时任务。** param params* return*/Overrideprotected Integer doInBackground(String... params) {InputStream is null;RandomAccessFile savedFile null;File file null;long downloadLength 0; //记录已经下载的文件长度//文件下载地址String downloadUrl params[0];//下载文件的名称String fileName downloadUrl.substring(downloadUrl.lastIndexOf(/));//下载文件存放的目录String directory Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();//创建一个文件file new File(directory fileName);if (file.exists()) {//如果文件存在的话得到文件的大小downloadLength file.length();}//得到下载内容的大小long contentLength getContentLength(downloadUrl);if (contentLength 0) {return TYPE_FAILED;} else if (contentLength downloadLength) {//已下载字节和文件总字节相等说明已经下载完成了return TYPE_SUCCESS;}OkHttpClient client new OkHttpClient();/*** HTTP请求是有一个Header的里面有个Range属性是定义下载区域的它接收的值是一个区间范围* 比如Range:bytes0-10000。这样我们就可以按照一定的规则将一个大文件拆分为若干很小的部分* 然后分批次的下载每个小块下载完成之后再合并到文件中这样即使下载中断了重新下载时* 也可以通过文件的字节长度来判断下载的起始点然后重启断点续传的过程直到最后完成下载过程。*/Request request new Request.Builder().addHeader(RANGE, bytes downloadLength - contentLength) //断点续传要用到的指示下载的区间.url(downloadUrl).build();try {Response response client.newCall(request).execute();if (response ! null) {is response.body().byteStream();savedFile new RandomAccessFile(file, rw);savedFile.seek(downloadLength);//跳过已经下载的字节byte[] b new byte[1024];int total 0;int len;while ((len is.read(b)) ! -1) {if (isCanceled) {return TYPE_CANCELED;} else if (isPaused) {return TYPE_PAUSED;} else {total len;savedFile.write(b, 0, len);//计算已经下载的百分比int progress (int) ((total downloadLength) * 100 / contentLength);//注意在doInBackground()中是不可以进行UI操作的如果需要更新UI,比如说反馈当前任务的执行进度//可以调用publishProgress()方法完成。publishProgress(progress);}}response.body().close();return TYPE_SUCCESS;}} catch (IOException e) {e.printStackTrace();} finally {try {if (is ! null) {is.close();}if (savedFile ! null) {savedFile.close();}if (isCanceled file ! null) {file.delete();}} catch (Exception e) {e.printStackTrace();}}return TYPE_FAILED;}/*** 当在后台任务中调用了publishProgress(Progress...)方法之后onProgressUpdate()方法* 就会很快被调用该方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对UI进行操作利用参数中的数值就可以* 对界面进行相应的更新。** param values*/Overrideprotected void onProgressUpdate(Integer... values) {int progress values[0];if (progress lastProgress) {listener.onProgress(progress);lastProgress progress;}}/*** 当后台任务执行完毕并通过Return语句进行返回时这个方法就很快被调用。返回的数据会作为参数* 传递到此方法中可以利用返回的数据来进行一些UI操作。** param status*/Overrideprotected void onPostExecute(Integer status) {switch (status) {case TYPE_SUCCESS:listener.onSuccess();break;case TYPE_FAILED:listener.onFailed();break;case TYPE_PAUSED:listener.onPaused();break;case TYPE_CANCELED:listener.onCanceled();break;default:break;}}public void pauseDownload() {isPaused true;}public void cancelDownload() {isCanceled true;}/*** 得到下载内容的完整大小** param downloadUrl* return*/private long getContentLength(String downloadUrl) {OkHttpClient client new OkHttpClient();Request request new Request.Builder().url(downloadUrl).build();try {Response response client.newCall(request).execute();if (response ! null response.isSuccessful()) {long contentLength response.body().contentLength();response.body().close();return contentLength;}} catch (IOException e) {e.printStackTrace();}return 0;}} public class DownloadListener {/*** 通知当前的下载进度* param progress*/void onProgress(int progress);/*** 通知下载成功*/void onSuccess();/*** 通知下载失败*/void onFailed();/*** 通知下载暂停*/void onPaused();/*** 通知下载取消事件*/void onCanceled();}推荐阅读Android OkHttp 文件上传与下载的进度监听扩展 - 掘金
http://www.hkea.cn/news/14420593/

相关文章:

  • 最便宜 双网站建设logo设计公司介绍
  • 许昌市网站开发crm管理系统登录入口官网
  • 网站建设基础流程图引擎优化是什么工作
  • 做论坛网站怎么样备案做国外营销型网站
  • 广西新站seo注册自媒体账号平台
  • 英文网站的外部链接 建设wordpress载入慢
  • 有一个做5s壁纸的网站阿里巴巴1688
  • 平谷区网站建设中国万网陈峰欣
  • 网站主体注销英文网站设计理念
  • 中英双语营销型网站青龙建站教程
  • 公司网站首页设计模板学科网站建设管理
  • php网站开发路线东莞软件网站推广
  • 网站模版 优帮云dede网站如何换源码
  • 做企业网站找哪家地方门户网站建设要求
  • 网站查询域名ip解析js判断是手机还是电脑访问网站
  • 网站建设具体运算浙江建设信息港网站查询
  • 门户网站部署方案公司宣传册设计样本下载
  • 设计主题网站广州网站优化关键词排名
  • 三九集团如何进行网站建设wordpress变慢
  • 自己的网站怎么和百度做友链typecho对比wordpress
  • 行业门户网站运营方案网站建设中所涉及的所有链接建设
  • 武义企业网站建设wordpress 51
  • 站长工具传媒福建省城乡住房建设厅网站
  • 宜宾网站建设08keji网站建设犀牛
  • 网站开发技术合同服装网站怎么做的
  • 如何做好网站内更新商业街网站建设方案
  • 阿里云如何添加新网站长沙做网站团队
  • 刘涛做的网站微信小程序怎么注销账号
  • 东莞市网站建设分站个人制作网站工具
  • 咸阳网站建设公司电话餐厅网络推广方案