可直接看后面的解释
可仔细去看看着文章:https://www.jianshu.com/p/9aa969dd1b4d
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.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="match_parent" android:layout_height="wrap_content" android:id="@+id/contentTv" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package com.example.okhttp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private TextView contentTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentTv=findViewById(R.id.contentTv); //1、拿到OKHttpClient对象 OkHttpClient okHttpClient=new OkHttpClient(); //2、构造Request对象 Request request= new Request.Builder() //这里我们采用建造者模式和链式调用指明是进行Get请求, //并传入Get请求的地址 .get() .url("https://www.baidu.com") .build(); //3、将Request封装为Call Call call=okHttpClient.newCall(request); //4、根据需要调用同步或者异步请求方法 //同步调用,一般不用同步,因为同步调用会阻塞主线程,一般不适用 // try { // Response response=call.execute(); // } catch (IOException e) { // e.printStackTrace(); // } //异步调用 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //未收到服务器返回的结果 Toast.makeText(MainActivity.this, "get failed", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, Response response) throws IOException { //从onResponse中获得了返回的json数据 final String res=response.body().string(); runOnUiThread(new Runnable() { //异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理 @Override public void run() { contentTv.setText(res); } }); } }); } }注意,在准备工作做好了才能运行成功
运行结果:
相关解释:
使用OkHttp进行Get请求只需要四步即可完成。
1 . 拿到OkHttpClient对象
OkHttpClient client = new OkHttpClient(); //OkTttp是网络请求框架,Client是客户,所以是客户网络请求框架
2 . 构造Request对象
创建一个请求的建造者让他返回给请求对象
Request request = new Request.Builder() .get() .url("https:www.baidu.com") .build(); //request 请求 Builder建造者这里我们采用建造者模式和链式调用指明是进行Get请求,并传入Get请求的地址
如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后
"https:www.baidu.com?username=admin&password=admin" //注意这里是加的一个&
3 . 将Request封装为Call
Call call = client.newCall(request);
4 . 根据需要调用同步或者异步请求方法
//同步调用,返回Response,会抛出IO异常 Response response = call.execute(); //异步调用,并设置回调函数 call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, final Response response) throws IOException { final String res = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { contentTv.setText(res); } }); } });
第四步有一些需要注意的地方
同步调用会阻塞主线程,一般不适用异步调用的回调函数是在子线程,我们不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理是不是以为上面就结束了,对的,OkHttp的Get请求步骤就这么4步,但是当你试图打开应用加载数据,可是发现并没有加载到数据,这是一个简单但是我们常犯的错误. 在AndroidManifest.xml中加入联网权限
<uses-permission android:name="android.permission.INTERNET" />