OkHttp的简单封装

xiaoxiao2021-03-01  11

直接使用原生的OkHttp请求网络,尽管简单易懂,但每次需要写大量重复的代码,实在有些疲惫,于是进行一个简单的封装,只对最基本网络请求这一块进行了简单的处理,但有了这最基本的处理,之后再拓展应该会简单许多。

————更新一个问题——————

在我下面的写法中用到了handler,获取了主线程,请求成功或失败时候将数据分发到主线程进行处理,此处有可能出现NetworkOnMainThreadException的异常,去掉handler就可以了,但是就不能对ui进行直接更新,需要进一步处理

 

工具类:

import android.os.Handler; import android.os.Looper; import java.io.IOException; import java.util.Map; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class OkHttpUtils { private static OkHttpClient client; private static OkHttpUtils okHttpUtils; private Handler handler; private OkHttpUtils() { client = new OkHttpClient(); handler = new Handler(Looper.getMainLooper()); } /*单例模式 获取类实例*/ private static OkHttpUtils getInstance() { if (okHttpUtils == null) { synchronized (OkHttpClient.class) { okHttpUtils = new OkHttpUtils(); } } return okHttpUtils; } public static void doPost(String url,Map<String, String> param, String headerName, String header, final MyCallback callback){ getInstance().inner_doPost(url,param,headerName,header,callback); } /*内部方法 网络请求 * */ private void inner_doPost(String url, Map<String, String> param, String headerName, String header, final MyCallback callback) { final Request request; Request.Builder requestBuilder = new Request.Builder(); /*判断是否有请求体*/ if (param != null) { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> map : param.entrySet()) { String key = map.getKey(); String value; if (map.getValue() == null) { value = ""; } else { value = map.getValue(); } builder.add(key, value); } RequestBody requestBody = builder.build(); requestBuilder.post(requestBody); } /*判断是否有头部信息 * * 这里由于这一个项目的要求头部信息不多,我只用了很简单的一个写法 * 需要更多信息的可以使用Headers进行扩展 * */ if (header != null) { requestBuilder.addHeader(headerName, header); } request = requestBuilder .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { deliverRequestFailure(e,callback); } @Override public void onResponse(Call call, Response response) throws IOException { deliverRequestSuccess(response,callback); } }); } /*请求失败时回调*/ private void deliverRequestFailure(final IOException e, final MyCallback callback){ handler.post(new Runnable() { @Override public void run() { if (callback!=null) callback.onFailure(e); } }); } /*请求成功时回调*/ private void deliverRequestSuccess(final Response response, final MyCallback callback){ handler.post(new Runnable() { @Override public void run() { if (callback!=null) { try { callback.onResponse(response); } catch (IOException e) { e.printStackTrace(); } } } }); } /* * 外部回调*/ public interface MyCallback { void onResponse(Response response) throws IOException; void onFailure(IOException e); } }

使用:

Map<String,String> param=new HashMap<>(); param.put("phone",user); param.put("password",password); String url="http://www.xhban.com:8080/photograph_u/user/login"; OkHttpUtils.doPost(url, param, null, null, new OkHttpUtils.MyCallback() { @Override public void onResponse(Response response) throws IOException { //请求成功的数据处理 } @Override public void onFailure(IOException e) { Log.e(TAG, "onFailure: ",e ); } });

 

参考:OkHttp的基本使用和封装

转载请注明原文地址: https://www.6miu.com/read-3200221.html

最新回复(0)