OKHTTP 学习总结

原创 2017年07月12日 16:02:59

首先说下OkHttp3是Java和Android都能用,Android还有一个著名网络库叫Volley,那个只有Android能用。

导入库支持

gradle方式:会自动下载两个库OkHttp和Okio库

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

同步和异步

支持同步和异步的方式,总结同步方式call.execute(); 异步方式 call.enqueue

从android4以后规定了所有的网络请求不能在主线程执行,因此,以下方式的操作直接会crash,提示在主线程进行了操作

private void sendRequestWithOkHttp() {

    try {
        //create okhttpclient instance
        OkHttpClient client = new OkHttpClient();
        //create request object for send request
        Request request = new Request.Builder()
                .url("https://www.baidu.com")
                .build();

        //create call object and send request and finally get response
        Response response = client.newCall(request).execute();
        String responseData = response.body().string();
        showResponse(responseData);

    } catch (Exception e) {
        Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}


post是一样的,同样会报错,如何解决这一问题呢?创建新的线程,在子线程中执行对应的代码

private void sendSynThreadRequestWithOkHttp() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //create okhttpclient instance
                OkHttpClient client = new OkHttpClient();
                //create request object for send request
                Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();

                //create call object and send request and finally get response
                Response response = client.newCall(request).execute();
                String responseData = response.body().string();
                showResponse(responseData);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    ).start();
}


private void sendSynPostThreadRequest() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                OkHttpClient okHttpClient = new OkHttpClient();
                RequestBody body = new FormBody.Builder()
                        .add("key", "value")
                        .add("key", "value")
                        .build();
                Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .post(body)
                        .build();
                Call call = okHttpClient.newCall(request);

                try {
                    Response response = call.execute();
                    String responseData = response.body().string();
                    showResponse(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

}


异步的请求如下:get

private void sendAsynGetRequestWithOkHttp() {
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
            .url("https://www.baidu.com")
            .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
                Log.d("MainActivity", "Main Thread");
            } else {
                Log.d("MainActivity", "Not Main Thread");
            }
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {
            string = response.body().string(); //注意
            if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
                Log.d("MainActivity", "Main Thread");
            } else {
                Log.d("MainActivity", "Not Main Thread");

                MainActivity.this.runOnUiThread(new Runnable() { //注意
                    @Override
                    public void run() {
                        try {
                            showResponse(string);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                });
            }
        }
    });
}

注意:异步请求处理中,会发现回调方法并不是在主线程中执行的,如果想刷新页面,就需要切换到主线程来执行。这里采用了MainActivity.this.runOnUiThread 的方式。

但是与此同时,会发现运行报错,提示在主线程中执行了操作,为什么呢?因为原来的 String string = response.body().string();写在了showResponse一起,其他这是获取网络数据的,被认为网络操作在主线程进行了操作,依然不对。因此,就需要在主线程外执行。继续报错,不是final变量,于是这里将string声明成了成员变量,private String string;

private void showResponse(final String response) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            responstText.setText(response);
        }
    });
}

Get 和 Post

post主要最大的区别是添加了RequestBody来设置需要传递的键值对儿


OkHttp深入学习(一)——初探

Android 4.4之后,HttpURLConnection底层实现已被OkHttp替换。可以见得OkHttp的性能已经被Google所认同。对于为何会想深入了解该库的原因:因为它的最底层走到了ja...
  • evan_man
  • evan_man
  • 2016年04月17日 16:26
  • 5489

okHttp3学习总结

OkHttp3okHttp3 是一个 Android的基于Http的网络开源框架,是由 square 公司开发。 现在网上比较推荐的两个 Android 网络开源框架,一个是 okHttp,另一个是...
  • Earth_Programer
  • Earth_Programer
  • 2017年03月13日 00:37
  • 290

Okhttp使用总结

添加依赖:compile 'com.squareup.okhttp3:okhttp:3.4.2'一个简单的使用okhttp进行网络访问请求: //创建okhttpClient对象 ...
  • AINewBegin
  • AINewBegin
  • 2016年11月11日 21:42
  • 245

okhttp总结

带json数据的post请求 JSONObject objInfo = new JSONObject(); JSONObject objInfoData = new JSONO...
  • zhengbaoyu1990
  • zhengbaoyu1990
  • 2016年04月21日 15:09
  • 195

OKHttp使用详解及源码解析

前言上一篇博客了解了Retrofit的使用,它是对OKHttp的封装,且Retrofit2的内部实现是OKHttp3,下面就了解一下OKHttp3的使用!使用①首先导入依赖,最新的版本是3.4.1,在...
  • aiynmimi
  • aiynmimi
  • 2016年07月21日 17:09
  • 5429

关于OkHttp3的学习

网络请求 okhttp3
  • ting1406525501
  • ting1406525501
  • 2016年07月08日 18:56
  • 503

OKHTTP分享二缓存策略

与缓存有关的Header Expires Expires: Thu, 12 Jan 2017 11:01:33 GMT 表示到期时间,一般用在response报文中,当超过此时间响应将被认为是无效...
  • a854702872
  • a854702872
  • 2018年01月02日 16:19
  • 58

OkHttp解析大总结

先来看一下Request这个类,此类还是比较简单的,没有太多复杂的代码,内部就是对一些url、method、body等变量的封装。在整个OkHttp的网络请求流程中有一大部分的代码就是用来对这几个变量...
  • zxm317122667
  • zxm317122667
  • 2016年11月19日 14:06
  • 1485

OkHttp的封装和使用详解

其实一直想写这篇文章的,为什么不写呢?因为不想写,不要咬我.我要开始装逼了.接触okhttp是在2015年6月份左右,这已经过去了几年了,但是我对于它的爱犹如滔滔江水,连绵不绝,现在介绍一下,几年前我...
  • EaskShark
  • EaskShark
  • 2017年03月17日 20:06
  • 1468

十月学习总结 大学的第一个月

来到烟台两个月了,而真
  • zp___waj
  • zp___waj
  • 2014年11月03日 11:34
  • 2974
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OKHTTP 学习总结
举报原因:
原因补充:

(最多只允许输入30个字)