OkHttp的返回数据在子线程,所以经常用到Handler去结合使用,使我们的代码特别多,看起来特别乱,所以我就封装了一下,使得我们使用时获得的数据在主线程中,我封装了两种形式,一种是okhttp和handler结合,一种是okhttp和Rxjava结合,希望能够帮到大家。
1. okhttp和handler结合:
以下是需要的依赖:
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.okio:okio:1.13.0'
首先说一下怎么使用吧:
OkHttpUtils.getInstance().doGet("http://news-at.zhihu.com/api/4/news/latest",callback);
废话不多说,上工具类:
public abstract class OnUiCallback implements Callback {
public abstract void onFailed(String eStr);
public abstract void onSuccess(String result);
private Observer observer=new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
onFailed("");
}
@Override
public void onNext(String o) {
onSuccess(o);
}
};
@Override
public void onFailure(Call call, IOException e) {
String eStr=e.getMessage();
Observable.just(eStr).subscribe(observer);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result=response.body().string();
Observable.just(result).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
}
}
public class OkHttpUtils {
private static OkHttpUtils okHttpUtils=new OkHttpUtils();
private OkHttpUtils(){};
public static OkHttpUtils getInstance(){
return okHttpUtils;
}
private OkHttpClient client;
private void initOkHttpClient(){
if (client==null){
client=new OkHttpClient.Builder().build();
}
}
public void doGet(String path, Callback callback){
initOkHttpClient();
Request request=new Request.Builder().url(path).build();
client.newCall(request).enqueue(callback);
}
}
2. okhttp和Rxjava结合:
加上Rxjava的依赖:
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
使用方式:
OkHttpUtils.getInstance().doGet("", new OnUiCallback() {
@Override
public void onFailed(String eStr) {
//失败
}
@Override
public void onSuccess(String result) {
//成功
}
});
public class OkHttpUtils {
private static OkHttpUtils okHttpUtils=new OkHttpUtils();
private OkHttpUtils(){};
public static OkHttpUtils getInstance(){
return okHttpUtils;
}
private OkHttpClient client;
private void initOkHttpClient(){
if (client==null){
client=new OkHttpClient.Builder().build();
}
}
public void doGet(String path, Callback callback){
initOkHttpClient();
Request request=new Request.Builder().url(path).build();
client.newCall(request).enqueue(callback);
}
}
public abstract class OnUiCallback implements Callback {
public abstract void onFailed(String eStr);
public abstract void onSuccess(String result);
private Observer observer=new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
onFailed("");
}
@Override
public void onNext(String o) {
onSuccess(o);
}
};
@Override
public void onFailure(Call call, IOException e) {
String eStr=e.getMessage();
Observable.just(eStr).subscribe(observer);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result=response.body().string();
Observable.just(result).observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
}
}