Retrofit+Okhttp+RxJava

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

直接上代码,首先是BaseView

publicinterfaceBaseView1 {

/**

* 显示操作进度

*/

publicvoidshowProgress();

/**

* 关闭进度

*/

publicvoidcloseProgress();

/**

* 成功回调

*/

publicvoidexcuteErrSuccessCallBack(String s);

/**

* 失败回调

*/

publicvoidexcuteErrFailedCallBack(String s);

}

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

importandroid.os.Build;

importcom.google.gson.Gson;

importcom.google.gson.GsonBuilder;

importcom.lvgou.distribution.bean.CallBackVo;

importcom.lvgou.distribution.presenter.ErrorLogPresenter;

importcom.lvgou.distribution.view.BaseView1;

importcom.squareup.okhttp.OkHttpClient;

importjava.util.concurrent.TimeUnit;

importretrofit.GsonConverterFactory;

importretrofit.Retrofit;

importretrofit.RxJavaCallAdapterFactory;

importrx.Subscriber;

/**

* Created by Administrator on 2016/9/9.

*/

publicclassApiimplementsBaseView1 {

privatestaticApi ourInstance;

privateIServiceAPI gankService;

privateErrorLogPresenter errorLogPresenter;

publicstaticApi getInstance() {

if(ourInstance ==null) ourInstance =newApi();

returnourInstance;

}

publicbooleanisOne =true;

privateApi() {

OkHttpClient okHttpClient =newOkHttpClient();

okHttpClient.setReadTimeout(7676, TimeUnit.MILLISECONDS);

errorLogPresenter =newErrorLogPresenter(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 =newGsonBuilder()

.registerTypeAdapter(String.class,newDeserializerData())

.create();

Retrofit retrofit =newRetrofit.Builder().baseUrl("原网络请求地址")

.addCallAdapterFactory(

RxJavaCallAdapterFactory.create())

.addConverterFactory(GsonConverterFactory.create(mGson))

.client(okHttpClient)

.build();

this.gankService = retrofit.create(IServiceAPI.class);

}

publicIServiceAPI getGankService() {

returngankService;

}

/**

* 创建 Subscriber

*

* @param mICallBackListener

* @return Subscriber

*/

publicSubscriber createSubscriber(finalICallBackListener mICallBackListener) {

Subscriber mSubscriber =newSubscriber() {

@Override

publicvoidonCompleted() {

//                Log.i(TAG, "[onCompleted]");

}

@Override

publicvoidonError(Throwable e) {

//                Log.e(TAG, "[onError]" + e.getMessage());

CallBackVo mCallBackVo =newCallBackVo();

//                mCallBackVo.setResCode("400");

//                mCallBackVo.setResMsg("请求失败");

//                mCallBackVo.setResObj(null);

return;

}

@Override

publicvoidonNext(String s) {

Gson gosn =newGson();

CallBackVo mCallBackVo = gosn.fromJson(s, CallBackVo.class);

if(mCallBackVo.getStatus().equals("1")) {

mICallBackListener.onSuccess(s);

}else{

mICallBackListener.onFaild(mCallBackVo.getMessage());

}

}

};

returnmSubscriber;

}

@SuppressWarnings("static-access")

publicstaticString GetDeviceName() {

returnnewBuild().MODEL;

}

@Override

publicvoidshowProgress() {

}

@Override

publicvoidcloseProgress() {

}

@Override

publicvoidexcuteErrSuccessCallBack(String s) {

}

@Override

publicvoidexcuteErrFailedCallBack(String s) {

}

}

这样就完成了第一步,接下来就是网上很多的retrofit的运用,怎么去传递参数问题,对于这个我只是举例我post上传的方式,其它的去网上其它位子copy一下就行了

publicinterfaceIServiceAPI {

@FormUrlEncoded

@POST("网络请求链接尾")

Observable shareMedal(@Field("参数名字") String 参数值,@Field("参数名字") String 参数值);

}

剩下就来看怎么去调用这个网络请求了

publicclassShareMedalImplimplementsShareMedalModel {

@Override

publicvoidshareMedal(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,就写上

voidshareMedal(String 参数值,String 参数值, ICallBackListener callBackListener);

这个方法而已

接下来就是presenter层了,也就是最后层,就是对上面的这些的调用,然后想办法返回出去自己请求网络的结果,是失败还是成功什么的。

publicclassShareMedalPresenterextendsBasePresenter {

privateShareMedalImpl shareMedalImpl;

privateShareMedalView shareMedalView;

privateHandler mHandler;

publicShareMedalPresenter(ShareMedalView shareMedalView) {

this.shareMedalView = shareMedalView;

shareMedalImpl =newShareMedalImpl();

mHandler =newHandler(Looper.getMainLooper());

}

publicvoidshareMedal(String 参数, String 参数) {

shareMedalImpl.shareMedal(参数,参数,newICallBackListener() {

@Override

publicvoidonSuccess(finalString s) {

mHandler.post(newRunnable() {

@Override

publicvoidrun() {

shareMedalView.closeShareMedalProgress();

shareMedalView.OnShareMedalSuccCallBack("1", s);

}

});

}

@Override

publicvoidonFaild(finalString s) {

mHandler.post(newRunnable() {

@Override

publicvoidrun() {

shareMedalView.closeShareMedalProgress();

shareMedalView.OnShareMedalFialCallBack("1", s);

}

});

}

});

}

}

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

publicinterfaceShareMedalView {

/**

* 成功回调

*

* @param state

* @param respanse

*/

voidOnShareMedalSuccCallBack(String state, String respanse);

/**

* 失败回调

*

* @param state

* @param respanse

*/

voidOnShareMedalFialCallBack(String state, String respanse);

/**

* 关闭弹窗

*/

voidcloseShareMedalProgress();

}

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

[java]view plaincopy

publicabstractclassBasePresenter {

publicT mView;

publicCompositeSubscription mCompositeSubscription;

publicDataManager mDataManager;

publicvoidattach(T mView){

this.mView=mView;

this.mCompositeSubscription =newCompositeSubscription();

//        this.mDataManager = DataManager.getInstance();

}

publicvoiddettach(){

mView=null;

this.mCompositeSubscription.unsubscribe();

this.mCompositeSubscription =null;

//        this.mDataManager = null;

}

publicbooleanisViewAttached() {

returnmView !=null;

}

publicT getMvpView() {

returnmView;

}

}

调用的时候实例化

shareMedalPresenter = new ShareMedalPresenter(this);

shareMedalPresenter .sharemedal()方法就行了

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


csdn项目地址:http://blog.csdn.net/greatdaocaoren/article/details/74555729

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容