在AndroidManifest.xml配置网络访问权限:

   <!-- 访问网络是危险的行为 所以需要权限 -->
    <uses-permission android:name="android.permission.INTERNET" />

 

在 app/build.gradle 加入 

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

  然后点击 sync now 下载okhttp支持包

 

OKHttpEngine

package liudeli.async.okhttp;

import android.util.Log;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * @Author Liudeli
 * @Describe:网络请求相关的引擎
 */
public class OKHttpEngine {

    private final String TAG = OKHttpEngine.class.getSimpleName();

    /**
     * 单例模式
     */
    private static OKHttpEngine engine;
    public static OKHttpEngine getInstance() {

        if (null == engine) {

            synchronized (OKHttpEngine.class) {

                if (null == engine) {
                    engine = new OKHttpEngine();
                }
            }
        }
        return engine;
    }

    private OKHttpEngine(){}

    private OkHttpClient client = new OkHttpClient();

    /**
     * Http Get 请求
     * [属于同步方法,使用需要加子线程]
     * @param url
     * @return
     * @throws IOException
     */
    public String httpGetResult(String url) throws IOException {

        Request request = new Request.Builder()
                .url(url)
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    }

    /**
     * Http Post 请求
     * [属于同步方法,使用需要加子线程]
     * @param url
     * @return
     * @throws IOException
     */
    public String httpPostResult(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    }



    /***************************** 以下属于JSON请求想的代码了 **********************************/

    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

    /**
     * 联调成功方法 postJsonRequest
     * [属于同步方法,使用需要加子线程,此方法内部已经加入子线程]
     * @param url
     * @param stringJSON
     */
    public void postJsonRequest(final String url, final String stringJSON, final MyOKHttpCallback callback) {
        new Thread() {

            @Override
            public void run() {
                super.run();

                try {
                    RequestBody body = RequestBody.create(JSON, stringJSON);

                    Request request = new Request.Builder()
                            .url(url)
                            .post(body)
                            .build();

                    Response response = client.newCall(request).execute();

                    String result = response.body().string();

                    Log.d(TAG, "请求结果信息 result:" + result);

                    callback.result(result);

                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e(TAG, "postJsonRequest e:" + e.getMessage());
                    callback.result("error");
                }
            }
        }.start();
    }

    /**
     * Post请求,请求的数据是JSON,异步方法,不需要加入子线程
     * @param url
     * @param stringJSON
     */
    public void postJSONRequest(String url, String stringJSON, Callback callback) {
        try {

            RequestBody body = RequestBody.create(JSON, stringJSON);

            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();

            Call call = client.newCall(request); // 使用client去请求

            call.enqueue(callback); // 回调方法,>>> 可以获得请求结果信息

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

 

MyOKHttpCallback

package liudeli.async.okhttp;

/**
 * @Author Liudeli
 * @Describe:ost、Get 普通请求所用到的接口回调接口
 */
public  abstract class MyOKHttpCallback {

    /**
     * 一般是用于,Post、Get 普通请求所用到的接口回调方法
     * 异步请求暂时用不到,因为异步用专门的回调方法
     * @param result
     */
    public abstract void result(String result);
}

 

MyActivity 使用 okhttp

package liudeli.async.okhttp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import org.json.JSONObject;

import java.io.IOException;

import liudeli.async.R;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_my); 
    }

    /**
     * 中国天气网地址:http://www.weather.com.cn
     */
    private final String PATH1 = "http://www.weather.com.cn/data/sk/101110101.html";
    private final String PATH2 = "http://www.weather.com.cn/data/sk/101110101.html";
    private final String PATH3 = "http://www.weather.com.cn/data/sk/101110101.html";
    private final String PATH4 = "http://www.weather.com.cn/data/sk/101110101.html";

    /**
     * 普通Http Get 请求
     * @param view
     */
    public void request1(View view) {
        final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance();

        new Thread(){

            @Override
            public void run() {
                super.run();

                try {
                    String result = okHttpEngine.httpGetResult(PATH1);
                    Log.d("@@@", "普通Http Get 请求 响应结果:" + result);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }

    /**
     * 普通Http Get 请求
     * @param view
     */
    public void request2(View view) {
        final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance();

        new Thread(){

            @Override
            public void run() {
                super.run();

                try {
                    String result = okHttpEngine.httpPostResult(PATH2);
                    Log.d("@@@", "普通Http Post 请求 响应结果:" + result);
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }

    /**
     * Post请求JSON数据1
     * @param view
     */
    public void request3(View view) {
        final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance();

        /**
         * 这里的JSON jsonString 到底有何用:
         *
         *  例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器
         *       请求头信息,是公司内部需要的请求头信息,是服务器规定的
         *       JSONObject jsonHeader = new JSONObject();
         *       jsonHeader.put("serviceCode", serviceCode);
         *       jsonHeader.put("channelCode", channelCode);
         *       jsonHeader.put("osType", onType);
         *       jsonHeader.put("appVersion", appVersion);
         *       jsonHeader.put("rocket", rocket);
         *       jsonHeader.put("requestTime", requestTime);
         *       ....
         *
         *       String jsonString =jsonHeader..toString();
         */

        /**
         * 这里的JSON jsonString 到底有何用:
         *
         *  例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器
         *       参数信息,是公司内部需要的参数信息,是服务器规定的
         *       JSONObject jsonParam = new JSONObject();
         *       jsonParam.put("param1", param1);
         *       jsonParam.put("param2", param2);
         *       jsonParam.put("param3", param3);
         *       jsonParam.put("param4", param4);
         *       jsonParam.put("param5", param5);
         *       jsonParam.put("param6", param6);
         *
         *       String jsonString =  jsonParam.toString();
         */

        try {
            JSONObject jsonParam = new JSONObject();
            /*jsonParam.put("param1", "");
            jsonParam.put("param2", "");
            jsonParam.put("param3", "");
            jsonParam.put("param4", "");
            jsonParam.put("param5", "");
            jsonParam.put("param6", "");*/

            // 注意⚠️:jsonString =  null  当RequestBody.create(JSON, stringJSON);时会报错
            String jsonString = null /*jsonParam.toString()*/ ;

            okHttpEngine.postJsonRequest(PATH3, jsonString, new MyOKHttpCallback() {

                @Override
                public void result(String result) {
                    Log.d("@@@", "Post请求JSON数据1 响应结果:" + result);
                }
            });

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

    }

    /**
     * Post请求JSON数据2  -  okhttp异步
     * @param view
     */
    public void request4(View view) {
        final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance();

        /**
         * 这里的JSON jsonString 到底有何用:
         *
         *  例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器
         *       请求头信息,是公司内部需要的请求头信息,是服务器规定的
         *       JSONObject jsonHeader = new JSONObject();
         *       jsonHeader.put("serviceCode", serviceCode);
         *       jsonHeader.put("channelCode", channelCode);
         *       jsonHeader.put("osType", onType);
         *       jsonHeader.put("appVersion", appVersion);
         *       jsonHeader.put("rocket", rocket);
         *       jsonHeader.put("requestTime", requestTime);
         *       ....
         *
         *       String jsonString =jsonHeader..toString();
         */

        /**
         * 这里的JSON jsonString 到底有何用:
         *
         *  例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器
         *       参数信息,是公司内部需要的参数信息,是服务器规定的
         *       JSONObject jsonParam = new JSONObject();
         *       jsonParam.put("param1", param1);
         *       jsonParam.put("param2", param2);
         *       jsonParam.put("param3", param3);
         *       jsonParam.put("param4", param4);
         *       jsonParam.put("param5", param5);
         *       jsonParam.put("param6", param6);
         *
         *       String jsonString =  jsonParam.toString();
         */

        try {
            JSONObject jsonParam = new JSONObject();
            /*jsonParam.put("param1", "");
            jsonParam.put("param2", "");
            jsonParam.put("param3", "");
            jsonParam.put("param4", "");
            jsonParam.put("param5", "");
            jsonParam.put("param6", "");*/

            // 注意⚠️:jsonString =  null  当RequestBody.create(JSON, stringJSON);时会报错
            String jsonString =  null; /*jsonParam.toString()*/ ;

            okHttpEngine.postJSONRequest(PATH4, jsonString, new Callback() {

                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("@@@", "call.toString:" + call.toString());
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    // 获得网络数据
                    String result = response.body().string();
                    Log.d("@@@",  "响应成功 call.toString:" + call.toString() + "  result:" + result);
                }

            });

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

 

activity_my.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">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="普通Http Get 请求"
        android:onClick="request1"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="普通Http Post 请求"
        android:onClick="request2"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Post请求JSON数据1"
        android:onClick="request3"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Post请求JSON数据2  -  okhttp异步"
        android:onClick="request4"
        />

</LinearLayout>

 

由于只有中国天气网地址:http://www.weather.com.cn ,所以不能对这个天气网服务器传参数(JSON jsonString),所以后面两个按钮就不点击测试了,它们是👌OK的