NoHttp封装--05 文件下载

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ProgressBar
        android:id="@+id/pb_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp" />

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_start_download"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="下载" />

</LinearLayout>

java:

  1 import com.yolanda.nohttp.Headers;
  2 import com.yolanda.nohttp.NoHttp;
  3 import com.yolanda.nohttp.download.DownloadListener;
  4 import com.yolanda.nohttp.download.DownloadRequest;
  5 import com.yolanda.nohttp.error.ArgumentError;
  6 import com.yolanda.nohttp.error.ClientError;
  7 import com.yolanda.nohttp.error.NetworkError;
  8 import com.yolanda.nohttp.error.ServerError;
  9 import com.yolanda.nohttp.error.StorageReadWriteError;
 10 import com.yolanda.nohttp.error.StorageSpaceNotEnoughError;
 11 import com.yolanda.nohttp.error.TimeoutError;
 12 import com.yolanda.nohttp.error.URLError;
 13 import com.yolanda.nohttp.error.UnKnownHostError;
 14 import com.yolanda.nohttp5.R;
 15 import com.yolanda.nohttp5.config.AppConfig;
 16 import com.yolanda.nohttp5.nohttp.CallServer;
 17 import com.yolanda.nohttp5.util.Toast;
 18 
 19 import android.app.Activity;
 20 import android.os.Bundle;
 21 import android.os.Environment;
 22 import android.view.View;
 23 import android.widget.ProgressBar;
 24 import android.widget.TextView;
 25 
 26 public class DownloadActivity extends Activity implements View.OnClickListener, DownloadListener {
 27 
 28     private final static String PROGRESS_KEY = "download_progress";
 29     /**
 30      * 下载按钮、暂停、开始等.
 31      */
 32     private TextView mBtnStart;
 33     /**
 34      * 下载状态.
 35      */
 36     private TextView mTvResult;
 37     /**
 38      * 下载进度条.
 39      */
 40     private ProgressBar mProgressBar;
 41     /***
 42      * 下载地址.
 43      */
 44     private String url = "http://m.apk.67mo.com/apk/999129_21769077_1443483983292.apk";
 45     /**
 46      * 下载请求.
 47      */
 48     private DownloadRequest downloadRequest;
 49 
 50     @Override
 51     protected void onCreate(Bundle savedInstanceState) {
 52         super.onCreate(savedInstanceState);
 53         setContentView(R.layout.activity_download);
 54 
 55         mProgressBar = (ProgressBar) findViewById(R.id.pb_progress);
 56         mBtnStart = (TextView) findViewById(R.id.btn_start_download);
 57         mTvResult = (TextView) findViewById(R.id.tv_result);
 58         mBtnStart.setOnClickListener(this);
 59 
 60         // url 下载地址
 61         // fileFolder 保存的文件夹
 62         // fileName 文件名
 63         // isRange 是否断点续传下载
 64         // isDeleteOld 如果发现文件已经存在是否删除后重新下载
 65         String path = Environment.getExternalStorageDirectory().getAbsolutePath();
 66         downloadRequest = NoHttp.createDownloadRequest(url, path, "nohttp.apk", true, false);
 67 
 68         // 检查已经下载了一半的文件是什么状态
 69         int status = downloadRequest.checkBeforeStatus();
 70         if (status == DownloadRequest.STATUS_FINISH) {// 文件已经下载完成
 71             mTvResult.setText("下载完成");
 72             mBtnStart.setText("已经下载完成");
 73             // ... 提示用户安装apk
 74         } else if (status == DownloadRequest.STATUS_RESTART) {// 代表文件不存在,需要从头下载
 75             mTvResult.setText("");
 76             mBtnStart.setText("下载");
 77         } else if (status == DownloadRequest.STATUS_RESUME) {// 代表文件已经下载了一半了
 78             int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, 0);
 79             mProgressBar.setProgress(progress);
 80             mTvResult.setText("已经下载了 " + progress + "%");
 81             mBtnStart.setText("继续下载");
 82         }
 83     }
 84 
 85     @Override
 86     public void onClick(View v) {
 87         if (downloadRequest.isStarted()) {
 88             // 暂停下载
 89             downloadRequest.cancel(true);
 90         } else {
 91             // what 区分下载
 92             // downloadRequest 下载请求对象
 93             // downloadListener 下载监听
 94             CallServer.getDownloadInstance().add(0, downloadRequest, this);
 95         }
 96     }
 97 
 98     /**
 99      * @param what 代表哪一个下载
100      * @param isResume 是不是断点续续传开始下载的
101      * @param beforeLenght 断点开始的地方的文件大小
102      * @param headers 本地请求的时候的响应头
103      * @param allCount 本次需要下载多少
104      */
105     @Override
106     public void onStart(int what, boolean isResume, long beforeLenght, Headers headers, long allCount) {
107         int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, 0);
108         mTvResult.setText("已下载: " + progress + "%");
109         mBtnStart.setText("暂停");
110     }
111 
112     @Override
113     public void onProgress(int what, int progress, long fileCount) {
114         AppConfig.getInstance().putInt(PROGRESS_KEY, progress);
115         mProgressBar.setProgress(progress);
116         mTvResult.setText("已经下载了 " + progress + "%");
117     }
118 
119     @Override
120     public void onDownloadError(int what, Exception exception) {
121         mBtnStart.setText("再次尝试");
122 
123         String message = "下载出错了:";
124         if (exception instanceof ClientError) {
125             message += "客户端错误";
126         } else if (exception instanceof ServerError) {
127             message += "服务器发生内部错误";
128         } else if (exception instanceof NetworkError) {
129             message += "网络不可用,请检查网络";
130         } else if (exception instanceof StorageReadWriteError) {
131             message += "存储卡错误,请检查存储卡";
132         } else if (exception instanceof StorageSpaceNotEnoughError) {
133             message += "存储位置空间不足";
134         } else if (exception instanceof TimeoutError) {
135             message += "下载超时";
136         } else if (exception instanceof UnKnownHostError) {
137             message += "服务器找不到";
138         } else if (exception instanceof URLError) {
139             message += "url地址错误";
140         } else if (exception instanceof ArgumentError) {
141             message += "下载参数错误";
142         } else {
143             message += "未知错误";
144         }
145         mTvResult.setText(message);
146     }
147 
148     @Override
149     public void onFinish(int what, String filePath) {
150         Toast.show("下载完成");
151         mTvResult.setText("下载完成,文件保存在:" + filePath);
152     }
153 
154     @Override
155     public void onCancel(int what) {
156         mTvResult.setText("下载暂停");
157         mBtnStart.setText("继续下载");
158     }
159 
160 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NoHttp 是专门做Android网络请求与下载的框架。支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载;支持304缓存,302/303重定向,支持代理服务器。NoHttp特性:支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,上传下载均有进度。支持304缓存,自定义缓存,302/303重定向,支持代理服务器访问地址(如: Google)。NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息,Cookie。使用Gradle构建时添加依赖:// 引用最新版 compile 'com.yolanda.nohttp:nohttp: ' // 或则引用指定版本 compile 'com.yolanda.nohttp:nohttp:1.0.0'一. 请求1.请求String数据// 请求对象 Request request = NoHttp.createStringRequest(url, requestMethod); //添加请求头 request.addHeader("AppVersioin", "2.0"); // 添加请求参数 request.add("userName", "yolanda"); //上传文件 request.add("file", new FileBinary(file)); ...2.请求Json数据// JsonObject Request request = NoHttp.createJsonObjectRequest(url, reqeustMethod); queue.add(what, request, responseListener); … // JsonArray Request request = NoHttp.createJsonArrayRequest(url, reqeustMethod); queue.add(what, request, responseListener);3. 请求Bitmap数据Request request = NoHttp.createImageRequest(url, requestMethod); ...4. 取消请求取消单个请求Request request = NoHttp.createStringRequest(url); ... request.cancel();从队列中取消指定的请求Request request = NoHttp.createStringRequest(url); request.setCancelSign(sign); … queue.cancelBySign(sign);取消队列中所有请求queue.cancelAll();停止队列RequestQueue queue = NoHttp.newRequestQueue(); ... queue.stop();5. 同步请求// 在当前线程发起请求,在线程这么使用 Request request = NoHttp.createStringRequest(url); Response response = NoHttp.startRequestSync(request); if (response.isSucceed()) {     // 请求成功 } else {     // 请求失败 }二. 缓存1. Http标准协议的缓存,比如响应码是304时现在很多公司使用了RESTFUL风格来写Http API,所以这个是必须有的。Request request = NoHttp.createJsonObjectRequest(url); // NoHttp本身是RESTFUL风格的标准Http协议,所以这里不用设置或者设置为DEFAULT request.setCacheMode(CacheMode.DEFAULT); ...2. 当请求服务器失败的时候,读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为REQUEST_FAILED_READ_CACHE request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); ...3. 如果发现有缓存直接成功,没有缓存才请求服务器我们知道ImageLoader的核心除了内存优化外,剩下一个就是发现把内地有图片则直接使用,没有则请求服务器,所以NoHttp这一点非常使用做一个ImageLoader。Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为IF_NONE_CACHE_REQUEST request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...请求图片,缓存图片。// 如果没有缓存才去请求服务器,否则使用缓存,缓存图片演示 Request request = NoHttp.createImageRequest(imageUrl); request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); ...4. 仅仅读取缓存Request request = NoHttp.createJsonObjectRequest(url); // 非标准Http协议,改变缓存模式为ONLY_READ_CACHE request.setCacheMode(CacheMode.ONLY_READ_CACHE); ...注意:缓存不管是String、Json、图片还是任何请求都可以被NoHttp缓存二、响应OnResponseListener responseListener = new OnResponseListener() {     @Override     public void onStart(int what) {         // 请求开始时,可以显示一个Dialog     }     @Override     public void onFinish(int what) {         // 请求接受时,关闭Dialog     }     @Override     public void onSucceed(int what, Response response) {         // 接受请求结果         String result = response.get();         // Bitmap imageHead = response.get(); // 如果是bitmap类型,都是同样的用法     }     @Override     public void onFailed(int what, String url, Object tag, Exception exception, ...) {         // 请求失败或者发生异常         // 这里根据exception处理不同的错误,比如超时、网络不好等     } };三. 自定义请求类型: FastJsonRequest1.定义请求对象public class FastJsonRequest extends RestRequestor { public FastJsonRequest(String url) {     super(url); } public FastJsonRequest(String url, RequestMethod requestMethod) {     super(url, requestMethod); } @Override public JSONObject parseResponse(String url, Headers headers, byte[] responseBody) {     String result = StringRequest.parseResponseString(url, headers, responseBody);     JSONObject jsonObject = null;     if (!TextUtils.isEmpty(result)) {         jsonObject = JSON.parseObject(result);     } else {         // 这里默认的错误可以定义为你们自己的数据格式         jsonObject = JSON.toJSON("{}");     }     return jsonObject; } @Override public String getAccept() {     // 告诉服务器你接受什么类型的数据, 会添加到请求头的Accept中     return "application/json;q=1"; } }2.使用自定义请求-和NoHttp默认请求没有区别Request mRequest = new FastJsonRequest(url, requestMethod); queue.add(what, mRequest, responseListener);五. 下载文件发起下载请求//下载文件 downloadRequest = NoHttp.createDownloadRequest(url, fielDir, fileName, true, false); // what 区分下载 // downloadRequest 下载请求对象 // downloadListener 下载监听 CallServer.getDownloadInstance().add(0, downloadRequest, downloadListener);暂停或者停止下载downloadRequest.cancel();监听下载过程private DownloadListener downloadListener = new DownloadListener() {     @Override     public void onStart(int what, boolean resume, long preLenght, Headers header, long count) {     }     @Override     public void onProgress(int what, int progress, long downCount) {         // 更新下载进度     }     @Override     public void onFinish(int what, String filePath) {     }     @Override     public void onDownloadError(int what, StatusCode code, CharSequence message) {     }     @Override     public void onCancel(int what) {     } }; 标签:NoHttp

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值