超简单MVP+网络请求框架(Retrofit2+Rxjava2+OkHttp3)

本文介绍了如何结合Retrofit2、Rxjava2和OkHttp3构建一个简单的MVP网络请求框架。首先,文章列出了必要的依赖,并强调了所需的权限。接着,详细阐述了接口定义、回调、模型类以及其实现、presenter层和Presenter的实现。最后,特别提到了RetrofitManager在框架中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依赖

    //Gson
    implementation 'com.google.code.gson:gson:2.4'

    //okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.9.0'
    //日志拦截器
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    //配置retrofit2.0
    implementation 'com.squareup.retrofit2:retrofit:+'
    //ConverterFactory的Gson依赖包
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"
    //Rxjava2需要依赖
    implementation 'io.reactivex.rxjava2:rxjava:+'
    implementation 'io.reactivex.rxjava2:rxandroid:+'
    //让retrofit支持Rxjava2
    implementation 'com.squareup.retrofit2:adapter-rxjava2:+'

权限

 <uses-permission android:name="android.permission.INTERNET" />

存放接口的类

public class ApiConstant {

    public static final Integer SUCCEDCODE = 20000;

    public static final String BASE_URL = "https://www.zhaobanzhilian.com/api/";//通用前缀
}

api

    @GET
    Observable<ResponseBody> get(@Url String url);

    @FormUrlEncoded
    @POST
    Observable<ResponseBody> post(@Url String url, @FieldMap Map<String, Object> map);

    @PUT
    Observable<ResponseBody> put(@Url String url, @QueryMap Map<String, String> map);

    @DELETE
    Observable<ResponseBody> delete(@Url String url);

    @POST
    Observable<ResponseBody> Image(@Url String url, @Body MultipartBody body);

callback

public interface CallBack<T> {
    void success(T data);
    void error(T error);
}

model

public interface Model<T> {
    void onGetSetData(String url, Class clas, CallBack callBack);

    void onPostSetDataBody(String url,Map<String, Object> body, Class clas, CallBack callBack);

    void onDeleteSetData(String url, Class clas, CallBack callBack);

    void onPutSetData(String url, Map<String, String> map, Class clas, CallBack callBack);

    void imgList(String url,List<Object> list, Class clas, CallBack callBack);

    void imgPath(String url,String path, Class clas, CallBack callBack);
}

ModelImpl

public class ModelImpl implements Model {
    @Override
    public void onGetSetData(String url, final Class clas, final CallBack callBack) {
        RetrofitManager.getInstence().get(url, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }

    @Override
    public void onDeleteSetData(String url, final Class clas, final CallBack callBack) {
        RetrofitManager.getInstence().delete(url, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }

    @Override
    public void imgList(String url, List list, Class clas, CallBack callBack) {
        RetrofitManager.getInstence().imageList(url, list, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }

    @Override
    public void imgPath(String url, String path, Class clas, CallBack callBack) {
        RetrofitManager.getInstence().imagePath(url, path, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }

    @Override
    public void onPutSetData(String url, Map map, final Class clas, final CallBack callBack) {
        RetrofitManager.getInstence().put(url, map, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }

    @Override
    public void onPostSetDataBody(String url, final Map map, final Class clas, final CallBack callBack) {
        RetrofitManager.getInstence().post(url, map, new RetrofitManager.HttpListener() {
            @Override
            public void onSuccess(String data) {
                Object o = new Gson().fromJson(data, clas);
                callBack.success(o);
            }

            @Override
            public void onFail(String error) {
                callBack.error(error);
            }
        });
    }
}

presenter

public interface Presenter {
    void onGetStartRequest(String url, Class clas);

    void onPostStartRequestBody(String url, Map<String, Object> body, Class clas);

    void onDeleteStartRequest(String url, Class clas);

    void onPutStartRequest(String url, Map<String, String> map, Class clas);

    void imgList(String url,List<Object> list, Class clas);

    void imgPath(String url,String path, Class clas);
}

PresenterImpl

public class PresenterImpl implements Presenter {
    private ModelImpl model;
    private ViewI viewI;

    public PresenterImpl(ViewI viewI) {
        this.viewI = viewI;
        model = new ModelImpl();
    }

    @Override
    public void onGetStartRequest(String url, Class clas) {
        model.onGetSetData(url, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }

            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }

    @Override
    public void onPostStartRequestBody(String url, Map<String, Object> body, Class clas) {
        model.onPostSetDataBody(url, body, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }

            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }

    @Override
    public void onDeleteStartRequest(String url, Class clas) {
        model.onGetSetData(url, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }


            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }


    @Override
    public void onPutStartRequest(String url, Map<String, String> map, Class clas) {
        model.onPutSetData(url, map, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }

            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }

    @Override
    public void imgList(String url, List<Object> list, Class clas) {
        model.imgList(url, list, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }

            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }

    @Override
    public void imgPath(String url, String path, Class clas) {
        model.imgPath(url, path, clas, new CallBack() {
            @Override
            public void success(Object data) {
                viewI.success(data);
            }

            @Override
            public void error(Object error) {
                viewI.error(error);
            }
        });
    }

    public void setDestory() {
        if (model != null) {
            model = null;
        }
        if (viewI != null) {
            viewI = null;
        }
    }
}

RetrofitManager

public class RetrofitManager<T> {

    private final ApiService apiService;

    public RetrofitManager() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                .readTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .connectTimeout(20, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                /*添加cookie示例, 没有需要就不写,有需要看这篇文章 https://blog.youkuaiyun.com/ZHUHUOHUO/article/details/112761959
                .addInterceptor(new AddCookiesInterceptor())//非首次登录直接拿出来用
                .addInterceptor(new ReceivedCookiesInterceptor())//首次登录成功保存到本地*/
                /* 添加请求头示例 没有需要就不写,有需要就写上
                .addInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                         //拿到请求
		                Request request=chain.request();
		                //取出数据
		                SharedPreferences sharedPreferences=App.getApplication().getSharedPreferences("login",Context.MODE_PRIVATE);
		                String userId = sharedPreferences.getString("userId", "");
		                String sessionId= sharedPreferences.getString("sessionId", "");
		                Request.Builder builder1=request.newBuilder();
		                builder1.method(request.method(),request.body());
		                //添加
		                if (!TextUtils.isEmpty(userId)&&!TextUtils.isEmpty(sessionId)){
		                    builder1.addHeader("userId",userId);
		                    builder1.addHeader("sessionId",sessionId);
		                }
		               Request reques=builder1.build();
		               return chain.proceed(reques);
		        	}
                })*/
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(ApiConstant.BASE_URL)
                .client(okHttpClient)
                .build();

        apiService = retrofit.create(ApiService.class);

    }

    public static RetrofitManager getInstence() {
        return RetrofitHodler.retrofitManager;
    }

    private static class RetrofitHodler {
        static RetrofitManager retrofitManager = new RetrofitManager();
    }

    //get请求
    public void get(String url, HttpListener httplistener) {

        apiService.get(url)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getObserver(httplistener));
    }

    public void delete(String url, HttpListener listener) {

        apiService.get(url)
                //后台执行在哪个线程中
                .subscribeOn(Schedulers.io())
                //最终完成后执行在哪个线程
                .observeOn(AndroidSchedulers.mainThread())
                //设置我们的rxJava
                .subscribe(getObserver(listener));
    }
    
    //post请求
    public void post(String url, Map<String, Object> map, HttpListener listener) {
        if (map == null) {
            map = new HashMap<>();
        }
        apiService.post(url, map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getObserver(listener));
    }

    //put请求

    public void put(String url, Map<String, String> map, HttpListener listener) {
        if (map == null) {
            map = new HashMap<>();
        }
        apiService.put(url, map)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getObserver(listener));
    }

    // 上传图片
    public void imageList(String url, List<Object> list, HttpListener listener) {

        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        builder.addFormDataPart("fileType", "images");
        if (list.size() == 1) {
            for (int i = 0; i < list.size(); i++) {
                File file = new File((String) list.get(i));
                builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("images/jpg"), file));
            }
        }

        apiService.Image(url, builder.build()).subscribeOn(Schedulers.io())
                //在主线程调用
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getObserver(listener));
    }

    // 多图+视频 上传
    public void imagePath(String url, String path, HttpListener listener) {

        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        File file = new File((String) path);
        if(path.contains("mp4")){
            builder.addFormDataPart("fileType", "videos");
            builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("video/*"), file));
        }else{
            builder.addFormDataPart("fileType", "images");
            builder.addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("images/*"), file));
        }

        apiService.Image(url, builder.build()).subscribeOn(Schedulers.io())
                //在主线程调用
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getObserver(listener));
    }


    public interface HttpListener {
        void onSuccess(String data);

        void onFail(String error);
    }

    private Observer<ResponseBody> getObserver(HttpListener httpListener) {

        Observer<ResponseBody> observer = new Observer<ResponseBody>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String data = responseBody.string();
                    if (httpListener != null) {
                        httpListener.onSuccess(data);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    if (httpListener != null) {
                        httpListener.onSuccess(e.getMessage());
                    }
                }
            }

            @Override
            public void onError(Throwable e) {
                if (httpListener != null) {
                    httpListener.onFail(e.getMessage());
                }
            }

            @Override
            public void onComplete() {

            }
        };
        return observer;
    }

    public static Map<String, Object> getFileMap() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("channel", "android");
        return map;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值