okHttp发送异步服务请求

50 篇文章 1 订阅

直接上代码,代码可用,其中用到了Json解析,我使用的Gson,大家自己下载。

package com.example.msh.utils;


import android.util.Log;

import org.json.JSONArray;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

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

/**
 * OkHttp 发送服务请求帮助类
 *Author:William(徐威)
 *Create Time:2018-07-24*/
public class OkHttpManager {
    private static String TAG = "OkHttpManager";
    static String apiUrl="http://192.168.1.47/Eson.Store.Host/";  // "http://storeservice.mmsshh.com/";

    private OkHttpClient mOkHttpClient;


    //public static String FAILURE = "failure";

    public enum State {SUCCESS, FAILURE, NETWORK_FAILURE}

    private static ResultCallback defaultResultCallback = new ResultCallback() {
        @Override
        public void onCallBack(State state, String result) {
            Log.e(TAG, "由于未定义ResultCallback参数,以下信息未被处理" +
                    "\tstate:" + state +
                    "\tresult:" + result);
        }
    };

    private String Network_Failure_Message = "Timeout:请检查网络连接。";

    /**
     * 单例模式:
     * "静态内部类的单例模式"只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式
     * Author:William(徐威)
     * Create Time:2018-07-24*/
    private static class OkHttpManagerBuilder {
        private static OkHttpManager okHttpManager = new OkHttpManager();
    }

    /**
     * 默认构造函数
     * Author:William(徐威)
     * Create Time:2018-07-24*/
    private OkHttpManager() {
        //mOkHttpClient=new OkHttpClient();//使用默认配置
        mOkHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(10000L, TimeUnit.MILLISECONDS)//10000毫秒
                .readTimeout(10000L, TimeUnit.MILLISECONDS)
                .writeTimeout(30L, TimeUnit.SECONDS)//30秒
                .build();
        Log.e(TAG, "调用了OkHttpManager一次");

    }

    private static OkHttpManager getInstance() {
        return OkHttpManagerBuilder.okHttpManager;
    }

    /**
     * 异步Post请求,以json格式发送数据
     *Author:William(徐威)
     *Create Time:2018-07-24*/
    public static void CommonPostJson(String json,String method, ResultCallback callback) {
        getInstance().PostJson(apiUrl+method+"?format=json", json, callback);
    }

    /**
     * 异步Post请求,以json格式发送数据
     * Author:William(徐威)
     * Create Time:2018-07-24*/
    private void PostJson(String url, String json, ResultCallback callback) {
        try {
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            byte[] postData = new byte[0];
            if (json != null) {
                postData = json.getBytes("UTF-8");
            }
            RequestBody mRequestBody = RequestBody.create(JSON, postData);
            Request request = new Request.Builder()
                    .url(url)
                    .post(mRequestBody)
                    .build();

            ExecuteAsyn_String(request, callback);

        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }

    /**
     * 开始执行异步请求,获得少量的String类型返回值。
     * 普通的异步post请求
     * Author:William(徐威)
     * Create Time:2018-07-24*/
    private void ExecuteAsyn_String(Request request, final ResultCallback callback) {
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

                callback.onCallBack(State.NETWORK_FAILURE, Network_Failure_Message);
                //Log.e(TAG, "OkHttp is on Failure:操作取消,文件读取失败或者连接超时");
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    Log.v(TAG, "the request was successfully received, understood, and accepted.");
                    String responseBody = response.body().string();

                    //回调,把response传递给调用该OKHttpUtil的线程
                    callback.onCallBack(State.SUCCESS, responseBody);
                } else {

                    Log.e(TAG, "OkHttp response is not successful. Code is: " + response.code());
                    callback.onCallBack(State.FAILURE, Integer.toString(response.code()));
                }
            }
        });
    }

    /**
     * 回调接口定义
     * Author:William(徐威)
     * Create Time:2018-07-24*/
    public interface ResultCallback {
        void onCallBack(State state, String result);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OkHttp发送异步请求的步骤如下: 1. 导入OkHttp库 在项目的build.gradle中添加以下依赖: ``` dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' } ``` 2. 创建OkHttp请求对象 OkHttp请求对象是Request类,可以根据需求设置请求方式、请求头等信息。例如: ``` Request request = new Request.Builder() .url("http://www.example.com") .build(); ``` 3. 创建OkHttpClient对象 OkHttpClient是OkHttp的核心类,需要通过它来发送请求。一般我们只需要创建一个OkHttpClient对象即可,可以使用单例模式。例如: ``` private static OkHttpClient okHttpClient; public static synchronized OkHttpClient getOkHttpClient() { if (okHttpClient == null) { okHttpClient = new OkHttpClient(); } return okHttpClient; } ``` 4. 发送异步请求 使用OkHttpClient的newCall方法创建一个Call对象,然后调用enqueue方法发送异步请求。例如: ``` OkHttpClient okHttpClient = getOkHttpClient(); Request request = new Request.Builder() .url("http://www.example.com") .build(); Call call = okHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 异常处理 } @Override public void onResponse(Call call, Response response) throws IOException { // 响应处理 } }); ``` 在回调方法中,onFailure方法会在请求失败时调用,onResponse方法会在请求成功并得到响应时调用。响应结果可以通过response.body().string()方法获取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值