Retrofit+Okhttp+RxJava

来源:互联网 发布:linux进图形化命令 编辑:程序博客网 时间:2024/05/18 12:30

很多朋友接手项目都开始带有Retrofit +Okhttp+RxJava搭建的网络请求框架,甚至有的还在尝试准备使用这个,接下来就来介绍一下这个网络请求框架的大致使用方法,和具体搭建方法。

直接上代码,首先是BaseView

public interface BaseView1 {    /**     * 显示操作进度     */    public void showProgress();    /**     * 关闭进度     */    public void closeProgress();    /**     * 成功回调     */    public void excuteErrSuccessCallBack(String s);    /**     * 失败回调     */    public void excuteErrFailedCallBack(String s);}

然后就是写实现BaseView的Api了,一般是将自己网络请求原地址写上去

import android.os.Build;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.lvgou.distribution.bean.CallBackVo;import com.lvgou.distribution.presenter.ErrorLogPresenter;import com.lvgou.distribution.view.BaseView1;import com.squareup.okhttp.OkHttpClient;import java.util.concurrent.TimeUnit;import retrofit.GsonConverterFactory;import retrofit.Retrofit;import retrofit.RxJavaCallAdapterFactory;import rx.Subscriber;/** * Created by Administrator on 2016/9/9. */public class Api implements BaseView1 {    private static Api ourInstance;    private IServiceAPI gankService;    private ErrorLogPresenter errorLogPresenter;    public static Api getInstance() {        if (ourInstance == null) ourInstance = new Api();        return ourInstance;    }    public boolean isOne = true;    private Api() {        OkHttpClient okHttpClient = new OkHttpClient();        okHttpClient.setReadTimeout(7676, TimeUnit.MILLISECONDS);        errorLogPresenter = new ErrorLogPresenter(this);        isOne = true;        /*         * 查看网络请求发送状况         *///            if (EasyApplication.getInstance().log) {//                okHttpClient.interceptors().add(chain -> {//                    Response response = chain.proceed(chain.request());//                    com.orhanobut.logger.Logger.d(chain.request().urlString());//                    return response;//                });//            }        Gson mGson = new GsonBuilder()                .registerTypeAdapter(String.class, new DeserializerData())                .create();        Retrofit retrofit = new Retrofit.Builder().baseUrl("原网络请求地址")                .addCallAdapterFactory(                        RxJavaCallAdapterFactory.create())                .addConverterFactory(GsonConverterFactory.create(mGson))                .client(okHttpClient)                .build();        this.gankService = retrofit.create(IServiceAPI.class);    }    public IServiceAPI getGankService() {        return gankService;    }    /**     * 创建 Subscriber     *     * @param mICallBackListener     * @return Subscriber     */    public Subscriber createSubscriber(final ICallBackListener mICallBackListener) {        Subscriber mSubscriber = new Subscriber<String>() {            @Override            public void onCompleted() {//                Log.i(TAG, "[onCompleted]");            }            @Override            public void onError(Throwable e) {//                Log.e(TAG, "[onError]" + e.getMessage());                CallBackVo mCallBackVo = new CallBackVo();//                mCallBackVo.setResCode("400");//                mCallBackVo.setResMsg("请求失败");//                mCallBackVo.setResObj(null);                               return;            }            @Override            public void onNext(String s) {                Gson gosn = new Gson();                CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class);                if (mCallBackVo.getStatus().equals("1")) {                    mICallBackListener.onSuccess(s);                } else {                                        mICallBackListener.onFaild(mCallBackVo.getMessage());                }            }        };        return mSubscriber;    }        @SuppressWarnings("static-access")    public static String GetDeviceName() {        return new Build().MODEL;    }    @Override    public void showProgress() {    }    @Override    public void closeProgress() {    }    @Override    public void excuteErrSuccessCallBack(String s) {    }    @Override    public void excuteErrFailedCallBack(String s) {    }}
这样就完成了第一步,接下来就是网上很多的retrofit的运用,怎么去传递参数问题,对于这个我只是举例我post上传的方式,其它的去网上其它位子copy一下就行了

public interface IServiceAPI {@FormUrlEncoded    @POST("网络请求链接尾")    Observable<String> shareMedal(@Field("参数名字") String 参数值, @Field("参数名字") String 参数值);}
剩下就来看怎么去调用这个网络请求了

public class ShareMedalImpl implements ShareMedalModel {    @Override    public void shareMedal(String 参数值,String 参数值, ICallBackListener callBackListener) {        IServiceAPI mIServiceAPI = Api.getInstance().getGankService();        mIServiceAPI.shareMedal(参数值, 参数值)                // Subscriber前面执行的代码都是在I/O线程中运行                .subscribeOn(Schedulers.io())                // 操作observeOn之后操作主线程中运行.                .observeOn(AndroidSchedulers.mainThread())                .subscribe(Api.getInstance().createSubscriber(callBackListener));    }}
这个就是调用第一步,获取到callback,然后进行post那边的调用

后面那个Model实际就是一个interface,就写上

void shareMedal(String 参数值,String 参数值, ICallBackListener callBackListener);
这个方法而已
接下来就是presenter层了,也就是最后层,就是对上面的这些的调用,然后想办法返回出去自己请求网络的结果,是失败还是成功什么的。

public class ShareMedalPresenter extends BasePresenter<ShareMedalView> {    private ShareMedalImpl shareMedalImpl;    private ShareMedalView shareMedalView;    private Handler mHandler;    public ShareMedalPresenter(ShareMedalView shareMedalView) {        this.shareMedalView = shareMedalView;        shareMedalImpl = new ShareMedalImpl();        mHandler = new Handler(Looper.getMainLooper());    }    public void shareMedal(String 参数, String 参数) {        shareMedalImpl.shareMedal(参数,参数, new ICallBackListener() {            @Override            public void onSuccess(final String s) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        shareMedalView.closeShareMedalProgress();                        shareMedalView.OnShareMedalSuccCallBack("1", s);                    }                });            }            @Override            public void onFaild(final String s) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        shareMedalView.closeShareMedalProgress();                        shareMedalView.OnShareMedalFialCallBack("1", s);                    }                });            }        });    }}

接下来要写的ShareMedalView这个也就是你调用实例化presenter位子要实现这个接口,然后实现方法的位子,就是new  Presenter(this),这里this是让当前类实现方法,会实现三个方法,也就是下面view要写出来的抽象方法:

public interface ShareMedalView {    /**     * 成功回调     *     * @param state     * @param respanse     */    void OnShareMedalSuccCallBack(String state, String respanse);    /**     * 失败回调     *     * @param state     * @param respanse     */    void OnShareMedalFialCallBack(String state, String respanse);    /**     * 关闭弹窗     */    void closeShareMedalProgress();}

对了,钓了一个basepresenter,这个也就是一个基类,写上也无妨

public abstract class BasePresenter<T> {    public T mView;    public CompositeSubscription mCompositeSubscription;    public DataManager mDataManager;    public void attach(T mView){        this.mView=mView;        this.mCompositeSubscription = new CompositeSubscription();//        this.mDataManager = DataManager.getInstance();    }    public void dettach(){        mView=null;        this.mCompositeSubscription.unsubscribe();        this.mCompositeSubscription = null;//        this.mDataManager = null;    }    public boolean isViewAttached() {        return mView != null;    }    public T getMvpView() {        return mView;    }}
调用的时候实例化
shareMedalPresenter = new ShareMedalPresenter(this);

shareMedalPresenter .sharemedal()方法就行了

哈哈,就这么简单,再也不要为Retrofit+Okhttp+RxJava这个框架烦恼了,其实也没什么高端的,不会用的时候永远觉得遥不可及,当切身使用就觉得没什么难的了。



原创粉丝点击