OKHttp使用之粗陋封装

来源:互联网 发布:中国突破第一岛链 知乎 编辑:程序博客网 时间:2024/06/16 03:41

使用单例模式维护一个特定配置的请求客户端

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() {            }        });
0 0
原创粉丝点击