Android网络下载框架

本文深入解析了OkHttp和Volley两大网络下载框架的使用方法,包括同步与异步请求、GET与POST操作、参数传递及结果处理。同时,提供了丰富的代码示例,帮助读者快速掌握网络数据交互的技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络下载框架

OkHttp

异步:可以直接运行,底层封装了线程
同步:必须放在子线程中执行,不需要重写接口的方法

get:同步
OkHttpClient:客户端
OkHttpclient client = new OkHttpClient();
Request:请求对象
Request r = new Request.Builder().url(网址).get/post(body).build
Response re = client.newCall®.execute();
获得结果
respone.body().String();

post:同步
FormBody:放参数
FormBody body = new FormBody.Builder().add(key,value),build();
吧body给请求对象

异步
获得Call;
Call call = clent.newCall(request)
重写接口方法:
Call.enquequ(new CallBack(){
OnFailure():失败
OnRespone():成功
})

Volley

volley适用于频率高的小数据的下载器
用法:
StringRequest r= new StringRequest(StringRequest.Method.GET/POST,网址,结果监听,错误监听)
获得队列:RequeQuequ que = Volley.newRequeQueue(上下文)
添加队列:que.add®
启动队列:que.start();

post:
重写 getParms(){创建HashMap,put参数}

下载图片:
ImageRequeue img = new ImageRequeue(网址,结果监听,宽,高,Bitmap.Config.GRB656,错误监听);

volley :post

// An highlighted block
public void volleyPost(String url,Context context){
       RequestQueue requestQueue = Volley.newRequestQueue(context);
       StringRequest request = new StringRequest(StringRequest.Method.POST,url,listener,errorListener){
           @Override
           protected Map<String, String> getParams() throws AuthFailureError {
               HashMap<String,String> hashMap = new HashMap<>();
               hashMap.put("phone","14785236995");
               hashMap.put("passwd","854721");
               return hashMap;

           }
       };

       requestQueue.add(request);
       requestQueue.start();



   }

volley:get

// An highlighted block
 public void volleyGet(String url, Context context){

        RequestQueue requestQueue = Volley.newRequestQueue(context);
        StringRequest request = new StringRequest(StringRequest.Method.GET,url,listener,errorListener);
        requestQueue.add(request);//将请求添加到队列
        requestQueue.start();//启动队列
    }

volley:get/post 的监听

// An highlighted block
   com.android.volley.Response.Listener<String> listener = new com.android.volley.Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.e("##########str",response);
        }
    };

    com.android.volley.Response.ErrorListener errorListener = new com.android.volley.Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    };

同步get

// An highlighted block
 public String Okhttp_get(String url){
//        OkHttpClient.Builder builder = new OkHttpClient.Builder();
//        builder.connectTimeout(20000, TimeUnit.MILLISECONDS);//设置连接超时
//        builder.readTimeout(4,TimeUnit.MINUTES);//分钟
//
//
//        OkHttpClient client = builder.build();//客户端
//        Request.Builder builder1 = new Request.Builder();
//        builder1.url(url);//访问的网址
//        Request request = builder1.build();
//
//        Call call = client.newCall(request);
//        try {
//            Response response = call.execute();
//            String string = response.body().string();
//            return string;
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        Request request = new Request.Builder().url(url).get().build();
        OkHttpClient client = new OkHttpClient();
        try {
            Response response = client.newCall(request).execute();
            if(response.isSuccessful()){
                String string = response.body().string();
                return string;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }
// An highlighted block
var foo = 'bar';

同步post

// An highlighted block
//OkHttp post同步方法,需要在线程中执行
    public String OkHttp_post(String url){
//       OkHttpClient.Builder obuilder = new OkHttpClient.Builder();
//        OkHttpClient client = obuilder.build();
//
//        Request.Builder rbuilder = new Request.Builder();
//        rbuilder.url(url);
//
//        FormBody.Builder builder = new FormBody.Builder();
//        builder.add("phone","19968458750");
//        builder.add("passwd","145235");
//        FormBody body = builder.build();
//        rbuilder.post(body);
//
//        Request request = rbuilder.build();
//        Call call = client.newCall(request);
//
//        try {
//            Response response = call.execute();
//            String string = response.body().string();
//            return string;
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        RequestBody body = new FormBody.Builder()
                .add("phone","17845698740")
                .add("passwd","856974")
                .build();
        Request request = new Request.Builder().url(url).post(body).build();

        OkHttpClient client = new OkHttpClient();
        try {
            Response response = client.newCall(request).execute();
            if(response.isSuccessful()){
                String string = response.body().string();
                return string;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }

异步方法

// An highlighted block
public class MyAsync extends AsyncTask<String,Void,String> {
    @Override
    protected String doInBackground(String... strings) {

//        return new Myutils().HttpUrlConnection_post(strings[0]);
//        return new Myutils().Okhttp_get(strings[0]);
          return new Myutils().OkHttp_post(strings[0]);
    }
}

异步post

// An highlighted block
 public void asyncPost(String url){
       OkHttpClient client = new OkHttpClient();
       FormBody body = new FormBody.Builder()
               .add("phone","14785236998")
               .add("passwd","569847")
               .build();

       Request request = new Request.Builder().url(url).post(body).build();

       Call call = client.newCall(request);
       call.enqueue(new okhttp3.Callback() {
           @Override
           public void onFailure(Call call, IOException e) {

           }

           @Override
           public void onResponse(Call call, Response response) throws IOException {
               String string = response.body().string();
               Log.e("########str",string);
           }
       });
    }

异步get

// An highlighted block
 public void asyncGet(String url){
       final Request request = new Request.Builder().url(url).get().build();
       OkHttpClient client = new OkHttpClient();

        Call call = client.newCall(request);
        call.enqueue(new okhttp3.Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                       String str = response.body().string();
                       Log.e("#######str",str);
            }
        });
    }

volley :img下载

// An highlighted block
 public void volleyimg(String url,Context context){
       RequestQueue requestQueue = Volley.newRequestQueue(context);
        ImageRequest request = new ImageRequest(url,listenerimg,100,100,Bitmap.Config.RGB_565,errorListener);
        requestQueue.add(request);
        requestQueue.start();
    }
    com.android.volley.Response.Listener<Bitmap> listenerimg = new com.android.volley.Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
              MainActivity.imageView.setImageBitmap(response);
        }
    };
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、付费专栏及课程。

余额充值