OkHttp的网络请求是在子线程中进行的,但不是在Android的主线程之外的线程。
- 同步请求会阻塞当前线程。
- 异步请求不会阻塞当前线程。
OkHttp的使用步骤
- 1.创建OkClient
OkHttpClient client = new OkHttpClient();
- 可以在创建OKClient的同时设置一些简单的参数,设置方式如下:
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(5, TimeUnit.SECONDS)
.build();
- 可以在创建OKClient的同时设置一些简单的参数,设置方式如下:
2.创建请求对象
Request request = new Request.Builder()
.url("https://www.baidu.com")
.get()
.build();3.创建Call对象
Call call = client.newCall(request);
- 同一个call,在当前请求未执行完之前只能被执行一次
- 4.执行请求
- 同步请求
call.execute()
- 异步请求
call.enqueue()
- 同步请求
- 5.处理请求结果。
使用案例
- 1.添加依赖
implementation 'com.squareup.okio:okio:1.14.0'
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
2.添加权限
<uses-permission android:name="android.permission.INTERNET" />
- 3.案例代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread() {
@Override
public void run() {
//同步请求
synRequest();
//异步请求
enqueueRequest();
}
}.start();
}
//创建 client
OkHttpClient client = new OkHttpClient.Builder().
readTimeout(5, TimeUnit.SECONDS)
.build();
//创建request
Request request = new Request.Builder()
.url("https://www.baidu.com")
.get()
.build();
//同步请求
public void synRequest() {
//创建call
Call call = client.newCall(request);
try {
//执行同步请求
Response response = call.execute();
if (response.isSuccessful()) {
ResponseBody responseBody = response.body();
if (responseBody != null) {
System.out.println(responseBody.string());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//异步请求
public void enqueueRequest() {
//创建call
Call call = client.newCall(request);
//执行异步请求
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()) {
ResponseBody responseBody = response.body();
if (responseBody != null) {
System.out.println(responseBody.string());
}
}
}
});
}
}