美文网首页Andriod收藏RxJAva OKHttp Retrofit安卓技术
Android 你必须学会的okhttp3.0入门篇

Android 你必须学会的okhttp3.0入门篇

作者: 肖赛Soaic | 来源:发表于2016-08-17 22:19 被阅读4405次

    简单说一下学习okhttp的理由

    1. google在Android 6.0中删除了HttpClient的Api,采用的是则是okhttp
    2. 高效的使用HTTP,使应用运行更快更省流量
    3. 响应缓存数据避免重复网络请求
    4. 无缝的支持GZIP来减少数据流量
    5. 使用非常简单,请求和响应的Api具有流畅的建造和不变性,同时支持同步异步调用回调函数
    6. 如果网络出现问题,它会从常见的连接问题中恢复
    7. 如果服务器配置有多个IP地址,当第一个IP连接失败,它会尝试连接下一个IP

    以上是okhttp官网http://square.github.io/okhttp/以及结合网上的一些理解整理出来的,看到有不对的地方还望大家多多指出

    下面我们就开始学习怎么使用okhttp吧

    配置环境

    github地址:https://github.com/square/okhttp

    在builde.gradle里面添加上

    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    

    在AndroidManifest.xml添加所需权限

    <uses-permission android:name="android.permission.INTERNET" />
    

    基本使用

    • get异步请求

    通过get请求获取指定URL网页请求,这里要注意的是Android4.0以后需要在非主线程里使用。

    private OkHttpClient client = new OkHttpClient();
    public static void get(){
            //创建一个Request
            Request request = new Request.Builder()
                    .url("http://www.jianshu.com/")
                    .get()
                    .build();
            //发起异步请求,并加入回调
            client.newCall(request).enqueue(new Callback()
            {
                @Override
                public void onFailure(Call call,IOException e){
                    //请求失败回调
                }
                @Override
                public void onResponse(Call call,Response response) throws IOException{
                    //请求成功回调
                    Log.e("okHttp","get="+response.body().string());
                }
            });
        }
    
    • post异步请求
        private OkHttpClient client = new OkHttpClient();
        public static void post(){
            //创建Form表单对象,可以add多个键值队
            FormBody formBody = new FormBody.Builder()
                    .add("param","value")
                    .add("param","value")
                    .build();
            //创建一个Request
            Request request = new Request.Builder()
                    .url("http://www.jianshu.com/")
                    .post(formBody)
                    .build();
            //发起异步请求,并加入回调
            client.newCall(request).enqueue(new Callback()
            {
                @Override
                public void onFailure(Call call,IOException e){
                }
                @Override
                public void onResponse(Call call,Response response) throws IOException{
                    Log.e("okHttp","post="+response.body().string());
                }
            });
        }
    
    • 同步请求

    client.newCall(request).enqueue(new Callback())改成
    client.newCall(request).execute().body().string()即可

    • 文件上传与多文件上传
        public static void upload(){
            //多个文件集合
            List<File> list = new ArrayList<>();
            MultipartBody.Builder builder = new MultipartBody.Builder();
            //设置为表单类型
            builder.setType(MultipartBody.FORM);
            //添加表单键值
            builder.addFormDataPart("param","value");
            for (File file : list) {
                //添加多个文件
                RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
                builder.addFormDataPart("files", file.getName(), fileBody);
            }
            Request request = new Request.Builder()
                    .url("http://192.168.1.8/upload/UploadServlet")
                    .post(builder.build())
                    .build();
            //发起异步请求,并加入回调
            mOkHttpClient.newCall(request).enqueue(new Callback()
            {
                @Override
                public void onFailure(Call call,IOException e){
                }
                @Override
                public void onResponse(Call call,Response response) throws IOException{
                    Log.e("okHttp","updLoad="+response.body().string());
                }
            });
        }
    
    • 超时设置,整个程序应使用这一个mOkHttpClient对象
        public static void setTimeout(){
            mOkHttpClient.newBuilder()
                    .connectTimeout(10, TimeUnit.SECONDS)//10秒连接超时
                    .writeTimeout(10, TimeUnit.SECONDS)//10m秒写入超时
                    .readTimeout(10, TimeUnit.SECONDS)//10秒读取超时
                    .build();
        }
    
    • 文件下载
      其实很简单,只需要利用get同步或异步请求,然后通过
      client.newCall(request).execute().body().byteStream()
      获取InputStream输入流,写文件操作即可实现文件下载。

    好了,学到这里okhttp算是入门了,其实还有很多需要我们去学习的,例如缓存、授权证书、封装、用的过中碰到的一些情况等等,都需要我们进一步的了解和学习了,后面有时间我也会针对这些,写一篇okhttp进阶篇,还望大家能够多多关注。

    好记性不如烂笔头!

    相关文章

      网友评论

      • 93e5803ecb37:赞一个
      • 祝融夫人OR:client.newCall(request).execute(new Callback()
        复制代码不认真
        肖赛Soaic:@祝融夫人_唐辉 谢谢提醒,现在已经改过来了,测试get的时候是用的同步,后来写到简书上就没改过来,丑大了:sweat_smile:
        祝融夫人OR:@肖赛Soaic 是滴。。。你写的Get方法里面,写错了
        肖赛Soaic:@祝融夫人_唐辉 execute方法是同步请求,不需要加回调的
      • 捡淑:马克
      • 提丶米:学习了~

      本文标题:Android 你必须学会的okhttp3.0入门篇

      本文链接:https://www.haomeiwen.com/subject/ntxvsttx.html