使用单例模式维护一个特定配置的请求客户端
package com.itant.zhuling.tool.net;
import android.content.Context;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
/**
* Created by Jason on 2017/4/18.
*/
public class OKClient {
private static OKClient instance;
private OkHttpClient client;
private OKClient(Context context) {
//缓存文件最大限制大小20M
client = new OkHttpClient.Builder()
.readTimeout(15, TimeUnit.SECONDS)
.cache(new Cache(context.getCacheDir(), 1024*1024*20))
.writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
.readTimeout(15, TimeUnit.SECONDS)//设置读取数据超时时间
.retryOnConnectionFailure(false)//设置不进行连接失败重试
.build();
}
private static synchronized void syncInit(Context context) {
if (instance == null) {
instance = new OKClient(context);
}
}
public static OKClient getInstance(Context context) {
if (instance == null) {
syncInit(context);
}
return instance;
}
public OkHttpClient getClient() {
return client;
}
}
请求工具类1:
package com.itant.zhuling.tool.net;
import android.content.Context;
import com.itant.zhuling.error.NetError;
import java.io.IOException;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by Jason on 2017/4/18.
*/
public class ObservableTool {
/**
* 发送get请求
* @param context
* @param url
* @return
*/
public static Observable<String> getGetObFromUrl(final Context context, final String url) {
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
//将事件发射出去,持有观察者的对象
public void subscribe(final ObservableEmitter<String> emitter) throws Exception {
OkHttpClient client = OKClient.getInstance(context).getClient();
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();
emitter.onError(new NetError());
}
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
//拿到结果的一瞬间触发事件,并传递数据给观察者
try {
// 获取数据成功
String result = new String(response.body().bytes());
emitter.onNext(result);
} catch (Exception e) {
e.printStackTrace();
emitter.onError(new NetError());
}
} else {
emitter.onError(new NetError());
}
}
});
}
});
return observable;
}
}
请求工具类2(让请求运行在子线程里):
package com.itant.zhuling.tool.net;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 观察者装饰器
*/
public class ObservableDecorator {
public static <T> Observable<T> decorate(Observable<T> observable) {
Observable<T> newObservable = observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
//.delay(2, TimeUnit.SECONDS, AndroidSchedulers.mainThread()); // FIXME 模拟延迟,用于观察加载框等效果
return newObservable;
}
}
真正使用:
ObservableDecorator.decorate(ObservableTool.getGetObFromUrl(mContext, BASE_URL_MEI_ZHI + page)).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String result) {
try {
// 妹子获取成功
JSONObject jsonObject = new JSONObject(result);
Gson gson = new GsonBuilder().create();
List<Meizhi> meizhis = gson.fromJson(jsonObject.getString("results"), new TypeToken<List<Meizhi>>(){}.getType());
mView.getMeizhiSuc(meizhis);
} catch (Exception e) {
e.printStackTrace();
mView.getMeizhiFail(e.toString());
}
}
@Override
public void onError(Throwable e) {
mView.getMeizhiFail(e.toString());
}
@Override
public void onComplete() {
}
});