????????通过前面的操作,发现使用HttpURLConnection的写法 还是比较复杂的,那么使用OkHttp会变得简单吗?
?
?一、重写HttpUtil类
public class HttpUtil{
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}
}
Okhttp3.Callback
因为OkHttp库中自带了一个回调接口Callback, 类似于前面编写的HttpCallbackListener。
通过调用enqueue()方法,其内部不仅开好了子线 程,同时还会在子线程中去执行HTTP请求,最后将请 求的结果回调到Callback接口中。
?调用 调用HttpUtil类的 sendOkHttpRequest()方法
HttpUtil.sendOkHttpRequest(“https://www.baidu.com”,new okhttp3.Callback(){
@Override
public void onResponse(Call call,Response response) throws IOException {
//得到服务器返回的具体内容
String responseData = response.body().string();
}
@Override
public void onFailure(Call call,IOException e){
//对异常情况进行处理
}
});
注意?
????????不管是HttpURLConnection还是OkHttp,最终的回调接口都还是 在子线程中迚行的,因此不可以在回调接口中执行任何的UI操作。?
方法一:借助runOnUiThread()方法进行线程切换。
方法二:通过Handler对象传递消息给主线程。
二、代码部分
? 1、layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
? 2、activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
? 3、HttpUtil.java
package com.example.okhttpencapsulation;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class HttpUtil {
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
//通过okHttp框架的异步请求方式来完成数据的抓取
//1.获得OkHttpClient类的实例
OkHttpClient client = new OkHttpClient();
//2.创建Request对象,并通过属性设置目标网络地址,请求方式等
Request request = new Request.Builder()
.url(address) //将第一个参数传入url属性
.build();
//3.通过OkHttpClient类的实例调用newCall()方法来创建call对象,并把异步请求的结果送入回调接口
client.newCall(request).enqueue(callback);
}
}
? 4、MainActivity.java
package com.example.okhttpencapsulation;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
//1.定义字符串变量,用来存放给定的目标网络地址
private final String address = "https://www.baidu.com";
//2.定义Text View对象
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout1);
textView = findViewById(R.id.tv);
//调用工具栏HttpUtil工具类的sendOkHttpRequest()方法,抓取网络数据并进行处理
HttpUtil.sendOkHttpRequest(address,new okhttp3.Callback(){
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//1.定义一个变量,用来接收服务器返回的数据
final String responseData = response.body().string();
//2.通过runOnUiThread()进行线程切换
runOnUiThread(new Runnable() {
@Override
public void run() {
//完成UI操作
textView.setText(responseData);
}
});
}
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
});
}
}
|