Retrofit2+OkHttp3+RxJava网络请求封装

CSDN :https://blog.csdn.net/shuai497331206


第一步:  添加依赖

//RxJava

implementation 'io.reactivex:rxjava:1.1.3'

//RxAndroid

implementation 'io.reactivex:rxandroid:1.1.0'

//retrofit

implementation 'com.squareup.retrofit2:retrofit:2.0.0'

//retrofit依赖Gson

implementation 'com.squareup.retrofit2:converter-gson:2.0.0'

//OkHttp

implementation 'com.squareup.okhttp3:okhttp:3.8.0'

//retrofit依赖RxJava

implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.0'

//okhttp

implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'

//日志

implementation 'com.orhanobut:logger:2.2.0'


第二步:

RetrofitServiceManager

package com.example.myapplication;

import com.google.gson.Gson;

import com.google.gson.GsonBuilder;

import com.orhanobut.logger.Logger;

import java.io.IOException;

import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

import okhttp3.logging.HttpLoggingInterceptor;

import retrofit2.Retrofit;

import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;

import retrofit2.converter.gson.GsonConverterFactory;

/**

* Created by ShinnyYang on 2020/8/3.

*/

public class RetrofitServiceManager {

    private static final int DEFAULT_CONNECT_TIME = 12;

    private static final int DEFAULT_WRITE_TIME = 12;

    private static final int DEFAULT_READ_TIME = 12;

    private static OkHttpClient okHttpClient;

    private static final String REQUEST_PATH = "http://admin.qianduoduo.cy6.co";

    private static Retrofit retrofit;

    private RetrofitServiceManager() {

        retrofit = new Retrofit.Builder()

                .client(initOKHttp())//设置使用okhttp网络请求

                .baseUrl(REQUEST_PATH)//设置服务器路径

                .addConverterFactory(GsonConverterFactory.create())//添加转化库,默认是Gson

                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加回调库,采用RxJava

                .build();

    }

    public static OkHttpClient initOKHttp() {

        if (okHttpClient == null) {

            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(

                    new HttpLoggingInterceptor.Logger() {

                        @Override

                        public void log(String message) {

                            //防止&、=都被转义

                            Logger.e("okhttp==" + message);

                        }

                    }

            );

            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

            okHttpClient = new OkHttpClient.Builder()

                    /*  .addInterceptor(new Interceptor() {

                          @Override

                          public Response intercept(Chain chain) throws IOException {

                              Request request = chain.request()

                                      .newBuilder()

                                      .addHeader("AuthToken", "")

                                      .build();

                              return chain.proceed(request);

                          }

                      })*/

                    .connectTimeout(12, TimeUnit.SECONDS)

                    .readTimeout(12, TimeUnit.SECONDS)

                    .writeTimeout(12, TimeUnit.SECONDS)

                    .addInterceptor(loggingInterceptor)

                    .build();

        }

        return okHttpClient;

    }

    private static class SingletonHolder {

        private static final RetrofitServiceManager INSTANCE = new RetrofitServiceManager();

    }

    /*

    * 获取RetrofitServiceManager

    **/

    public static RetrofitServiceManager getInstance() {

        return SingletonHolder.INSTANCE;

    }

    public <T> T create(Class<T> service) {

        return retrofit.create(service);

    }

}



第三步:

AllApi


package com.example.myapplication;

import com.example.myapplication.bean.HomeListBean;

import java.util.Map;

import retrofit2.http.GET;

import retrofit2.http.Query;

import retrofit2.http.QueryMap;

import rx.Observable;

/**

* Created by ShinnyYang on 2020/8/3.

*/

public interface AllApi {

    @GET("/qddapiv2/index/list.php")

    Observable<HomeListBean> getHomeList(@QueryMap Map<String, Object> map);

}


第四步:

HttpModel


package com.example.myapplication;

import com.example.myapplication.bean.HomeListBean;

import java.util.Map;

import rx.Observable;

import rx.Observer;

import rx.android.schedulers.AndroidSchedulers;

import rx.schedulers.Schedulers;

/**

* Created by ShinnyYang on 2020/8/3.

*/

public class HttpModel {

    private static AllApi movieService = RetrofitServiceManager.getInstance().create(AllApi.class);

    public static void getList(Map<String, Object> map,

                                    Observer<HomeListBean> observer) {

        setSubscribe(movieService.getHomeList(map), observer);

    }

    private static <T> void setSubscribe(Observable<T> observable, Observer<T> observer) {

        observable.subscribeOn(Schedulers.io())

                .subscribeOn(Schedulers.newThread())//子线程访问网络

                .observeOn(AndroidSchedulers.mainThread())//回调到主线程

                .subscribe(observer);

    }

}


第五步 :

private void getData() {

    Map<String, Object> map = new HashMap<>();

    map.put("page", "1");

    map.put("auth", "");

    map.put("time", "1596091163");

    map.put("token", "ZcfveU5pHeYiqH6lfvE9qeIquMPVGnSloW7TYnryFCI=");

    map.put("uid", "0730096");

    map.put("action", "margin");

    map.put("device_no", "ece430f2-cda1-4c5c-be1e-a0657395470e");

    HttpModel.getList(map, new Observer<HomeListBean>() {

                @Override

                public void onCompleted() {

                    Toast.makeText(getApplicationContext(), "onCompleted", Toast.LENGTH_SHORT).show();

                }

                @Override

                public void onError(Throwable e) {

                    Logger.e("onError==>" + e.getMessage());

                }

                @Override

                public void onNext(HomeListBean homeListBean) {

                    Logger.e("onSuccess==>" + homeListBean.toString());

                }

            });

}



实体Bean

package com.example.myapplication.bean;

import java.util.List;

public class HomeListBean {

/**

* status : 1

* time : 1595819291

* pagenum : 1

* data : [{"task_id":"254","type_id":"11","thumb":"http://admin.qianduoduo.cy6.co/api/img/5.png","title":"999999999999999","unit_price":"400.00","num":"12","is_jingpin":"0","margin_per":1,"finish":2,"type_name":"微信转发","extra":"75"}]

* msg : 查询成功

*/

    private int status;

    private int time;

    private int pagenum;

    private Stringmsg;

    private Listdata;

    public int getStatus() {

return status;

    }

public void setStatus(int status) {

this.status = status;

    }

public int getTime() {

return time;

    }

public void setTime(int time) {

this.time = time;

    }

public int getPagenum() {

return pagenum;

    }

public void setPagenum(int pagenum) {

this.pagenum = pagenum;

    }

public StringgetMsg() {

return msg;

    }

public void setMsg(String msg) {

this.msg = msg;

    }

public ListgetData() {

return data;

    }

public void setData(List data) {

this.data = data;

    }

@Override

    public StringtoString() {

return "HomeListBean{" +

"status=" +status +

", time=" +time +

", pagenum=" +pagenum +

", msg='" +msg +'\'' +

", data=" +data +

'}';

    }

public static class DataBean {

/**

* task_id : 254

* type_id : 11

* thumb : http://admin.qianduoduo.cy6.co/api/img/5.png

* title : 999999999999999

* unit_price : 400.00

* num : 12

* is_jingpin : 0

* margin_per : 1

* finish : 2

* type_name : 微信转发

* extra : 75

*/

        private Stringtask_id;

        private Stringtype_id;

        private Stringthumb;

        private Stringtitle;

        private Stringunit_price;

        private Stringnum;

        private Stringis_jingpin;

        private int margin_per;

        private int finish;

        private Stringtype_name;

        private Stringextra;

        @Override

        public StringtoString() {

return "DataBean{" +

"task_id='" +task_id +'\'' +

", type_id='" +type_id +'\'' +

", thumb='" +thumb +'\'' +

", title='" +title +'\'' +

", unit_price='" +unit_price +'\'' +

", num='" +num +'\'' +

", is_jingpin='" +is_jingpin +'\'' +

", margin_per=" +margin_per +

", finish=" +finish +

", type_name='" +type_name +'\'' +

", extra='" +extra +'\'' +

'}';

        }

public StringgetTask_id() {

return task_id;

        }

public void setTask_id(String task_id) {

this.task_id = task_id;

        }

public StringgetType_id() {

return type_id;

        }

public void setType_id(String type_id) {

this.type_id = type_id;

        }

public StringgetThumb() {

return thumb;

        }

public void setThumb(String thumb) {

this.thumb = thumb;

        }

public StringgetTitle() {

return title;

        }

public void setTitle(String title) {

this.title = title;

        }

public StringgetUnit_price() {

return unit_price;

        }

public void setUnit_price(String unit_price) {

this.unit_price = unit_price;

        }

public StringgetNum() {

return num;

        }

public void setNum(String num) {

this.num = num;

        }

public StringgetIs_jingpin() {

return is_jingpin;

        }

public void setIs_jingpin(String is_jingpin) {

this.is_jingpin = is_jingpin;

        }

public int getMargin_per() {

return margin_per;

        }

public void setMargin_per(int margin_per) {

this.margin_per = margin_per;

        }

public int getFinish() {

return finish;

        }

public void setFinish(int finish) {

this.finish = finish;

        }

public StringgetType_name() {

return type_name;

        }

public void setType_name(String type_name) {

this.type_name = type_name;

        }

public StringgetExtra() {

return extra;

        }

public void setExtra(String extra) {

this.extra = extra;

        }

}

}

  完成!!!!!

常用的注解:

@GET GET请求方式

@POST POST请求方式

@Query GET请求参数

@Header用来添加Header请求头

@FormUrlEncoded post请求头标示 其他注解请求方式:

@PUT 表示这是一个PUT请求

@DELETE 表示这是一个DELETE请求

@HEAD 表示这是一个HEAD请求

@OPTIONS 表示这是一个OPTION请求

@PATCH 表示这是一个PAT请求

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