retrofit+Rxjava

依赖

//retrofit
    compile 'com.squareup.retrofit2:retrofit:+'
    compile 'com.squareup.retrofit2:converter-gson:+'

//Rxjava2
    compile 'io.reactivex.rxjava2:rxjava:+'
    compile 'io.reactivex.rxjava2:rxandroid:+'

//让retrofit支持Rxjava2
    compile 'com.squareup.retrofit2:adapter-rxjava2:+'

--------------------------------------------------------------------------------------------

 
 
public interface ApiService {
    @POST("quarter/getAd")
    @FormUrlEncoded
    Observable<BannerBean> banner(@FieldMap Map<String, String> map);

}

--------------------------------------------------------------------------------------------

public class Constants {
    public static String base_url="https://www.zhaoapi.cn/";
}

--------------------------------------------------------------------------------------------

public class MainActivity extends AppCompatActivity implements IView {
    private static final String TAG = "MainActivity";
    private TextView tv;

    @Override


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findViewById(R.id.tv);
        Presenter presenter = new Presenter(this);
        HashMap<String, String> stringStringHashMap = new HashMap<>();
        stringStringHashMap.put("", "");
        presenter.getData(stringStringHashMap, new Model());
    }

    @Override
    public void showdata(BannerBean bannerBean) {
        Log.e(TAG, "showdata: ----" + bannerBean.getCode());
        tv.setText(bannerBean.getCode()+"");
    }
}

--------------------------------------------------------------------------------------------

public class Model {
    private static final String TAG = "Model";

    public void getnetdate(Map<String, String> map, final ModelListener modelListener) {
        RetrofitUtil.getInstence().API().banner(map)
                //后台线程获取数据,主线程显示
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new Observer<BannerBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(BannerBean bannerBean) {
                        modelListener.successlistener(bannerBean);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: ---" + e.toString());
                    }

                    @Override
                    public void onComplete() {

                    }
                });

    }

    public interface ModelListener {
        void successlistener(BannerBean bannerBean);

        void errorlistener(String s);
    }
}

--------------------------------------------------------------------------------------------

public class Presenter {
    IView iView;

    public Presenter(IView iView) {
        this.iView = iView;
    }


    public void getData(Map<String, String> map, Model model) {
        model.getnetdate(map, new Model.ModelListener() {
            @Override
            public void successlistener(BannerBean bannerBean) {
                iView.showdata(bannerBean);
            }

            @Override
            public void errorlistener(String s) {

            }
        });
    }

}

--------------------------------------------------------------------------------------------

public class RetrofitUtil {
    private static RetrofitUtil RetrofitUtil;//工具类对象
    private static ApiService ApiService;//请求网络接口
    public static OkHttpClient okHttpClient;

    //静态块,获取OkHttpClient对象
    static {
        getOkHttpClient();
    }

    //单例锁模式
    public static RetrofitUtil getInstence() {
        if (RetrofitUtil == null) {
            synchronized (RetrofitUtil.class) {
                if (RetrofitUtil == null) {
                    RetrofitUtil = new RetrofitUtil();
                }
            }
        }
        return RetrofitUtil;
    }

    //单例模式获取okhttp
    public static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {
            synchronized (OkHttpClient.class) {
                if (okHttpClient == null) {
                    File fileDir = new File(Environment.getExternalStorageDirectory(), "cache");
                    long fileSize = 10 * 1024 * 1024;
                    okHttpClient = new OkHttpClient.Builder()
                            .addInterceptor(new MyInter())
                            //打印拦截器日志
                            .connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
                            .readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
                            .writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
                            //.cache(new Cache(fileDir,fileSize))//写入sd卡
                            .build();
                }
            }
        }
        return okHttpClient;
    }

    //私有的无参构造
    private RetrofitUtil() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.base_url)
                .addConverterFactory(GsonConverterFactory.create())//添加gson转换器

                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加rxjava转换器
                .client(okHttpClient)//添加okhttp
                .build();
        ApiService = retrofit.create(ApiService.class);
    }

    //获取
    public ApiService API() {
        return ApiService;
    }

    //拦截器
    static class MyInter implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Request.Builder request_builder = request.newBuilder();
            if ("GET".equals(request.method())) {
                HttpUrl.Builder builder = request.url().newBuilder();
                HttpUrl build = builder.addQueryParameter("source", "android")
                        .addQueryParameter("appVersion", "101")
                        .addQueryParameter("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16")
                        .build();
                request = request_builder.url(build).build();
            }

            if ("POST".equals(request.method())) {
                if (request.body() instanceof FormBody) {
                    System.out.println("FormBody开始添加公共参数");
                    FormBody.Builder builder = new FormBody.Builder();
                    FormBody body = (FormBody) request.body();

                    for (int i = 0; i < body.size(); i++) {
                        builder.add(body.encodedName(i), body.encodedValue(i));
                    }

                    body = builder.add("source", "android")
                            .add("appVersion", "101")
                            .add("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16")
                            .build();
                    System.out.println("开始添加公共参数55555");
                    request = request_builder.post(body).build();

                }
                //因为传送文件要用到 @Multipart注解
                else if (request.body() instanceof MultipartBody) {
                    MultipartBody body = (MultipartBody) request.body();
                    MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
                    builder.addFormDataPart("source", "android")
                            .addFormDataPart("appVersion", "101")
                            .addFormDataPart("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16");
                    List<MultipartBody.Part> parts = body.parts();
                    for (MultipartBody.Part part : parts) {
                        builder.addPart(part);
                    }
                    request = request_builder.post(builder.build()).build();
                }
            }
            return chain.proceed(request);

        }

        /**
         * 添加公共参数
         *
         * @param oldRequest
         * @return
         */
        private Request addParam(Request oldRequest) {
            HttpUrl.Builder builder = oldRequest.url()
                    .newBuilder()
                    .setEncodedQueryParameter("source", "android")
                    //自己的token
                    .setEncodedQueryParameter("token", "25D4D2D717DDB8BBE5A24CF2F16C3E16")
                    .setEncodedQueryParameter("appVersion", "101");

            Request newRequest = oldRequest.newBuilder()
                    .method(oldRequest.method(), oldRequest.body())
                    .url(builder.build())
                    .build();

            return newRequest;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lmy_xback/article/details/79742068