四、封装OkHttp
来源:互联网 发布:手机刷机数据恢复 编辑:程序博客网 时间:2024/06/06 21:07
网络请求使用OkHttp,至于为什么使用它,博客里已经有很多人说过它的优点了。
一、引入jar包
在build.gradle文件中加入一句即可
dependencies { compile 'com.squareup.okhttp3:okhttp:3.4.1'}
二、代码封装
1、为了便于传递url参数,我们先封装url
public class KengHttpBuilder { private StringBuffer url; private Map<String, Object> data; public KengHttpBuilder() { data = new HashMap<>(); url = new StringBuffer(); } public KengHttpBuilder put(String name, Object value) { data.put(name, value); return this; } public KengHttpBuilder url(String url) { this.url.append(url); return this; } public String getGetUrl() { for (String key: data.keySet()) { if (!url.toString().contains("?")) { url.append("?").append(key).append("=").append(data.get(key)); } else { url.append("&").append(key).append("=").append(data.get(key)); } } // TODO: 2016/7/28 打印url return url.toString(); }}2、自定义回调接口
public interface KengHttpCallback { void onSuccess(JSONObject data); void onFail(int code, String msg);}3、处理http
public class KengHttpManager { private static KengHttpManager mKengHttpManager; private OkHttpClient mOkHttpClient; private MyHandler mHandler; private KengHttpManager() { mOkHttpClient = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).build(); mHandler = new MyHandler(); } public static KengHttpManager getInstance() { if (mKengHttpManager == null) { mKengHttpManager = new KengHttpManager(); } return mKengHttpManager; } /** * 异步http请求 * @param builder * @param callback */ public void callAsyn(KengHttpBuilder builder, final KengHttpCallback callback) { final Request request = new Request.Builder().url(builder.getGetUrl()).build(); Call call = mOkHttpClient.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { if (callback != null) { // TODO: 2016/7/28 打印回调 HttpContent content = new HttpContent(); content.callback = callback; content.code = KengHttpCode.HTTP_ERROR; content.msg = e.getMessage(); mHandler.obtainMessage(HTTP_FAIL, content).sendToTarget(); } } @Override public void onResponse(Call call, Response response) throws IOException { if (callback != null) { JSONObject data = null; try { data = new JSONObject(response.body().string()); } catch (JSONException e) { // TODO: 2016/7/28 log统一处理 e.printStackTrace(); } if (data.optInt("code") == KengHttpCode.HTTP_OK) { // TODO: 2016/7/28 打印回调 HttpContent content = new HttpContent(); content.callback = callback; content.msg = data.optString("data"); mHandler.obtainMessage(HTTP_SUCCESS, content).sendToTarget(); } else { // TODO: 2016/7/28 打印回调 HttpContent content = new HttpContent(); content.callback = callback; content.code = data.optInt("code"); content.msg = data.optString("msg"); mHandler.obtainMessage(HTTP_FAIL, content).sendToTarget(); } } } }); } class MyHandler extends Handler { public MyHandler() { super(Looper.getMainLooper()); } @Override public void handleMessage(Message msg) { HttpContent content = (HttpContent)msg.obj; switch (msg.what) { case HTTP_SUCCESS: try { content.callback.onSuccess(new JSONObject(content.msg)); } catch (JSONException e) { // TODO: 2016/7/28 log统一处理 e.printStackTrace(); } break; case HTTP_FAIL: content.callback.onFail(content.code, content.msg); break; } } } class HttpContent { public int code; public String msg; public KengHttpCallback callback; } private static final int HTTP_SUCCESS = 200; private static final int HTTP_FAIL = 300;}4、封装http工具类,便于使用。这里有个小插曲,我把根路径设置为127.0.0.1的时候,访问不到我的本地服务器,改成我的IP之后就可以正常访问了。
public class HttpUtil { public static String BASE_URL = "http://192.168.1.5/keng"; public static void sendRequest(KengHttpBuilder builder, KengHttpCallback callback) { if (!NetworkUtil.isNetworkAvailable() && callback!=null) { callback.onFail(KengHttpCode.HTTP_NEWWORK_ERROR, KengApplication.getInstance().getString(R.string.network_error)); return; } KengHttpManager.getInstance().callAsyn(builder, callback); }}5、调用http
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setMTATag("MainActivity"); KengHttpBuilder builder = new KengHttpBuilder(); builder.url(HttpUtil.BASE_URL + "/client/user_findNickname_j.ss"); builder.put("username","hy1"); HttpUtil.sendRequest(builder, new KengHttpCallback() { @Override public void onSuccess(JSONObject data) { ((TextView)findViewById(R.id.tv_name)).setText(data.optString("nickname")); } @Override public void onFail(int code, String msg) { ((TextView)findViewById(R.id.tv_name)).setText(msg); } }); }}6、查询结果
参考: http://blog.csdn.net/lmj623565791/article/details/47911083
http://square.github.io/okhttp/#download
1 0
- 四、封装OkHttp
- okhttp封装okhttp-utils
- 封装OKHttp
- 封装OkHttp
- okhttp封装
- 封装OKHttp
- 封装OKHttp
- Okhttp封装
- OkHttp 封装
- OkHttp封装
- OKHttp封装
- Okhttp封装
- okHttp封装
- OkHttp封装
- Okhttp封装
- 封装okhttp
- okhttp封装
- 封装okhttp
- 如何在Android Studio使用Espresso框架自动化测试
- 完美 定义popwindow
- 调整数组顺序使奇数位于偶数前面
- 双向链表
- 夜间模式
- 四、封装OkHttp
- poj3628
- 安卓 toast
- Servlet(1)
- 传智播客黑马程序员骗局真相揭秘
- 解决:Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
- CentOS6.5上Boost库编译安装全记录
- http://wxb-j2ee.javaeye.com/blog/797958
- 动态的创建ImageView,并设置图片自适应