您的位置:首页 > 理论基础 > 计算机网络

Android-网络框架01OKHttp3

2017-02-17 14:22 435 查看
OKHttp官网:https://github.com/square/okhttp

PersistentCookieJar官网:https://github.com/franmontiel/PersistentCookieJar

在Android4.4源码中,HttpURLConnection已经替换成OKHttp了

本文的意义

简单3步实现okhttp的简单封装和使用,get和post。

转载请注明出处 ethan_xue博客

功能

get

post

基于Http的文件上传

文件下载

支持请求回调,直接返回对象,对象集合

支持Session保持

具体步骤

使用方法可查看官网。

按照下面步骤简单几步使用起来。

说明:call.execute()为同步请求,基本不用,因为会阻塞UI线程,而是用call.enqueue异步请求数据。

使用enqueue方法,将call放入请求队列,然后okHttp会在线程池中进行网络访问;只需要在适当的时候(需要操作UI的时候)发送一个消息给主线程的Handler(取决于Looper,使用 Looper.getMainLooper()

创建的Handler就是主线程Handler)就可以了~

(1)添加网络访问权限并添加库依赖

<uses-permission android:name="android.permission.INTERNET" />
compile 'com.squareup.okhttp3:okhttp:3.4.1'


(2)简单封装GET和POST

public class UtilsOKHttp {

private OkHttpClient client;
private volatile static UtilsOKHttp manager;
private Handler handler;

private UtilsOKHttp() {
client = new OkHttpClient();
handler = new Handler(Looper.getMainLooper());
}

public static UtilsOKHttp getInstance() {
if (manager == null) {
manager = new UtilsOKHttp();
}
return manager;
}

public void get(String url, final OKCallback callBack) {
get(url, null, callBack);
}

public void get(String url, HashMap<String, String> params, final OKCallback callBack) {
if (params != null && params.size() > 0) {
url = makeGetUrl(url, params);
}
final Request request = new Request.Builder().url(url).get().build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
onFailJsonStringMethod("请求失败", callBack);
}

@Override
public void onResponse(Call call, final Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onSuccessJsonStringMethod(response.body().string(), callBack);
} else {
onFailJsonStringMethod("请求失败", callBack);
}
}
});
}

/**
* post 模拟表单提交
*/
public void post(String url, HashMap<String, String> params, final OKCallback callBack) {
FormBody.Builder form_builder = new FormBody.Builder();//表单对象,包含以input开始的对象,以html表单为主
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
form_builder.add(entry.getKey(), entry.getValue());
}
}
RequestBody request_body = form_builder.build();
Request request = new Request.Builder().url(url).post(request_body).build();//采用post方式提交
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
onFailJsonStringMethod("请求失败", callBack);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onSuccessJsonStringMethod(response.body().string(), callBack);
} else {
onFailJsonStringMethod("请求失败", callBack);
}
}
});
}

/**
* 请求返回的结果是json字符串
*
* @param jsonValue
* @param callBack
*/
private void onSuccessJsonStringMethod(final String jsonValue, final OKCallback callBack) {
handler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.onSuccess(jsonValue);
} catch (Exception e) {
e.printStackTrace();
}

}
}
});
}

private void onFailJsonStringMethod(final String str, final OKCallback callBack) {
handler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.onFail(str);
} catch (Exception e) {
e.printStackTrace();
}

}
}
});
}

public interface OKCallback {
void onSuccess(String result);

void onFail(String failResult);
}

/**
* 拼接get的url
*
* @param params
* @return
*/
private String makeGetUrl(String oldUrl, HashMap<String, String> params) {
String url = oldUrl;
// 添加url参数
if (params != null) {
Iterator<String> it = params.keySet().iterator();
StringBuffer sb = null;
while (it.hasNext()) {
String key = it.next();
String value = params.get(key);
if (sb == null) {
sb = new StringBuffer();
sb.append("?");
} else {
sb.append("&");
}
sb.append(key);
sb.append("=");
sb.append(value);
}
url += sb.toString();
}
return url;
}
}


(3)封装后的使用

get

UtilsOKHttp.getInstance().get("http://www.baidu.com", new UtilsOKHttp.OKCallback() {
@Override
public void onSuccess(String result) {
// xxx
}

@Override
public void onFail(String result) {

}
});


post

HashMap<String, String> params = new HashMap<>();
params.put("username", login_user_et.getText().toString().trim());
params.put("password", login_pwd_et.getText().toString().trim());
UtilsOKHttp.getInstance().post("http://www.baidu.com", params, new UtilsOKHttp.OKCallback() {
@Override
public void onSuccess(String result) {
//xxx
}

@Override
public void onFail(String failResult) {

}
});


Q&A

问题1:CalledFromWrongThreadException怎么破?

分析:从错误的线程调用,是因为在主线程中操作UI,这在Android中是不允许的,所以需要切换到主线程中进行UI操作。

onResponse后,使用handler

@Override
public void onResponse(Call call, Response response) throws IOException {
Message msg = new Message();
msg.what=0;
msg.obj = response.body().string();
mHandler.sendMessage(msg);
}
/////
mHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
mTxt.setText((String) msg.obj);
}
};


或者使用runonUIthread();

runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText("xxx");
}
});


问题2:如何实现Cookies持久化?

使用PersistentCookieJar

compile 'com.github.franmontiel:PersistentCookieJar:v1.0.0'


android studio 引入库失败的话,可直接下载代码放到工程里

ClearableCookieJar cookieJar =
new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();


可参考的代码下载地址:http://download.csdn.net/detail/ethan_xue/9655282

参考

http://www.qingpingshan.com/rjbc/az/110232.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android