okhtttp优势
1.允许连接到同一个主机地址的所有请求,提高请求效率
2.共享Socket,减少对服务器的请求次数
3.通过连接池,减少了请求延迟
4.缓存响应数据来减少重复的网络请求
5.减少了对数据流量的消耗
6.自动处理GZip压缩
okhttp使用功能
get,post请求
文件的上传下载
加载图片(内部会图片大小自动压缩)
支持请求回调,直接返回对象、对象集合
支持session的保持
okhttp 操作步骤
- 导入依赖包: implementation 'com.squareup.okhttp3:okhttp:3.12.1' debugImplementation 'com.squareup.okhttp3:logging-interceptor:3.12.1
2.添加权限:<uses-permission android:name="android.permission.INTERNET" />
3.创建一个包util
4.创建一个OkhttpHelper来请求GetRequest是OKHttp访问的请求,有两个请求参数,请求参数url和回调参数Callback,(1)Get的请求参数都在url上,(2)get的请求方式,(3)build进行创建, client进行封装。
public class OkhttpHelper {
public static void getRequest(String url, Callback callback){
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder()
.url(url)
.get()
.build();
client.newCall(request).enqueue(callback);
}
}
2.在TestOkhttpActivity进行调用,先定义一个方法initRequest(); 使用工具方法调用一个类,第一个传url,第二个传callback的对象, 进行封装实现
public class TestOkhttpActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.okhttp_activity_main);
initRequest();
}
private void initRequest() {
String url ="https://wanandroid.com/wenda/comments/14500/json";
OkhttpHelper.getRequest(url, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("111111","onFailure:"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("111111","onResponse:"+response.body().string());
}
});
}
}
OKHttp同步和异步 1.1、同步 同步请求是指在请求发起到拿到响应结果之前,程序一直会处于不流畅的状态,无法接收新的请求,直至拿到响应 同步请求的好处在于:理解简单;实现简单;可以将响应结果返回做后续处理; 同步请求的缺点在于:不能支持高并发的情况,在对请求响应实时性要求不高的场景下,会影响性能 1.2、异步 异步请求是指请求发起后到拿到响应结果之前,程序是非阻塞状态,可以继续接收新的请求,响应回来时会调用一个回调处理响应数据 异步请求的好处在于:支持高并发的接口请求 异步请求的缺点在于:实现复杂;响应结果只能输出,不能返回,不利于接口的后续处理
Okhttp同步 同步请求是指在请求发起到拿到响应结果之前,程序一直会处于不,无法接收新的请求,直至拿到响应。
OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url("http://www.baidu.com")
.get().build();
Call call = client.newCall(request);
try {
Response response = call.execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
创建OkHttpClient和Request对象,两者均使用了Builder模式;然后将Request封装成Call对象,然后调用Call的execute()同步发送请求,最后打印响应。
Okhttp异步 异步请求是指请求发起后到拿到响应结果之前,程序是非阻塞状态,可以继续接收新的请求,响应回来时会调用一个回调处理响应数据。
OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url("http://www.baidu.com")
.get().build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
System.out.println("Fail");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
System.out.println(response.body().string());
}
});
同样是创建OkHttpClient、Request和Call,只是调用了enqueue方法并在回调中处理响应。