Retrofit+RxJava+MVP学习笔记

本文详细介绍了如何使用Retrofit和RxJava结合MVP模式进行网络请求处理,包括请求参数封装、实体类解析、网络请求管理、响应结果处理等内容,并通过登录页面的实现展示了具体的代码示例。

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

一、Retrofit:
1、对于统一请求参数的封装(封装到请求头中)
public class BaseIntercepter implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        //加入请求头的信息
        Request request = chain.request();
        request.newBuilder().addHeader("token","xxxx").build();
        Response response = chain.proceed(request);
        return response;

    }
}

2、实体类解析
(1)实体基类
public class BaseEntity<T>{

    // 接口请求返回带状态码
    public int code;
    // 服务器返回的提示信息
    public String tip;
    //data数据
    public T data;
}

3、网络请求管理类:
public class BaseHttpMethod {
    private static BaseHttpMethod instance;
    private Context mContext;
    private Retrofit retrofit;

    private static final String baseUrl = "http://101.200.xxx.xx/api/";

    //手动创建一个OkHttpClient
    private OkHttpClient okHttpClient(){
        //设置log显示
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        return new OkHttpClient.Builder()
                .retryOnConnectionFailure(true) //失败重连
                .readTimeout(60*1000, TimeUnit.MILLISECONDS)
                .addNetworkInterceptor(logging) //拦截器
                .addInterceptor(new BaseIntercepter())
                .build();
    }

    public BaseHttpMethod(){
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient())
                .build();
    }

    public static BaseHttpMethod getInstance(){
        if (instance==null){
            synchronized (BaseHttpMethod.class){
                instance = new BaseHttpMethod();
            }
        }
        return  instance;
    }

    public <T> T create(Class<T> service){
        return  retrofit.create(service);
    }

}

二、RxJava
1、对于返回值的统一处理 
(1)处理完成后的回调接口
public interface ApiCallBack<T> {

    void onSuccess(T model);

    void onFailure();

    void onCompleted();
}
(2)进行统一处理:
public class SubscriberCallBack<T> extends Subscriber<T> {

    private ApiCallBack<T> apiCallBack; //回调监听

    public SubscriberCallBack(ApiCallBack<T> apiCallBack) {
        this.apiCallBack = apiCallBack;
    }



    @Override
    public void onCompleted() {
        apiCallBack.onCompleted();
    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        apiCallBack.onFailure();
    }

    @Override
    public void onNext(T t) {
        if (t instanceof BaseEntity){
            BaseEntity<T> entity = (BaseEntity<T>) t;
            if (entity.code==1000){
                Log.e("aa","成功了");
            }
        }
        apiCallBack.onSuccess(t);
    }
}

三、MVP:
1、BasePresent:model和view交互的桥梁
public class BasePresenter {

    private CompositeSubscription mCompositeSubscription;
    private BaseView view;

    public BasePresenter(){

    }

    public BasePresenter(BaseView view){
        this.view = view;
    }

    //Rxjava取消注册,避免内存泄露
    public void onUnsubscribe(){
        view = null;
        if (mCompositeSubscription!=null&&mCompositeSubscription.hasSubscriptions()){
            mCompositeSubscription.unsubscribe();
        }
    }

    public void addSubscription(Observable observable, Subscriber subscriber){
        if (mCompositeSubscription==null){
            mCompositeSubscription = new CompositeSubscription();
        }
        mCompositeSubscription.add(observable
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(subscriber));
    }

}

三、简单登录页面demo:
1、LoginContract便于管理model,view,present的接口
public interface LoginContract {

    abstract class Presenter extends BasePresenter{
        //登陆
        abstract void login(String mobile,String code);
        //发送验证码
        abstract void sendVifycode(String moble);
    }

    interface View extends BaseView{
        void showSendVifyToast(BaseEntity<String> baseEntity);
        void loginSuccess(BaseEntity<UserEntity> userEntity);
    }

    //封装网络请求
    interface Model {
        @GET("user/vercodeLogin.go?")
        Observable<BaseEntity<UserEntity>> login(@Query("mobileNo") String phone,@Query("vercode") String code,@Query("appType") int type);
        @GET("user/sendVerCode.go?")
        Observable<BaseEntity<String>> sendVifyCode(@Query("mobileNo") String phone);
    }

}
2、LoginActivity:将网络请求需要的数据传给present,将present返回的数据做页面显示处理。
public class LoginActivity extends Activity implements LoginContract.View, View.OnClickListener {
    private LoginContract.Presenter mPresenter;
    private EditText mobileText;
    private EditText vercodeText;
    private Button submitBtm;
    private Button loginBtm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        mPresenter = new LoginPresenter(this);
        mobileText = (EditText) findViewById(R.id.id_login_mobilno_value);
        vercodeText = (EditText) findViewById(R.id.id_login_vercode_value);
        submitBtm = (Button) findViewById(R.id.id_login_vercode_btn);
        loginBtm = (Button) findViewById(R.id.id_login_btn);
        submitBtm.setOnClickListener(this);
        loginBtm.setOnClickListener(this);

    }

    //发送验证码后的页面处理
    @Override
    public void showSendVifyToast(BaseEntity<String> baseEntity) {

    }

//登录成功
@Override
public void loginSuccess(BaseEntity<UserEntity> userEntity) {
   
}

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.id_login_vercode_btn:
                mPresenter.sendVifycode(mobileText.getText().toString());
                break;
            case R.id.id_login_btn:
                mPresenter.login(mobileText.getText().toString(),vercodeText.getText().toString());
                break;
            default:
                break;
        }
    }

}

3、LoginModel:数据请求的操作:
public class LoginModel extends BaseModel implements LoginContract.Model {
    LoginContract.Model service = BaseHttpMethod.getInstance().create(LoginContract.Model.class);

    @Override
    public Observable<BaseEntity<UserEntity>> login(String phone,String code,int type) {
        return service.login(phone,code,type);
    }

    @Override
    public Observable<BaseEntity<String>> sendVifyCode(String phone) {
        return service.sendVifyCode(phone);
    }
}

4、LoginPresent:
public class LoginPresenter extends LoginContract.Presenter{

    private LoginContract.View mView;
    private LoginModel loginModel;

    public LoginPresenter(LoginContract.View view){
        this.mView = view;
        loginModel = new LoginModel();
    }

    @Override
    void login(String mobile, String code) {
        addSubscription(loginModel.login(mobile,code,0),new SubscriberCallBack(new ApiCallBack<BaseEntity<UserEntity>>() {
            @Override
            public void onSuccess(BaseEntity<UserEntity> model) {
                //登录成功
                mView.loginSuccess(model);
            }

            @Override
            public void onFailure() {

            }

            @Override
            public void onCompleted() {

            }
        }));
    }
    
    @Override
    public void sendVifycode(String moble) {
        addSubscription(loginModel.sendVifyCode(moble),new Subscriber<BaseEntity<String>>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(BaseEntity<String> baseEntity) {
                mView.showSendVifyToast(baseEntity);
            }
        });
    }
}

学习推荐:  
Rxjava:http://gank.io/post/560e15be2dca930e00da1083
MVP:http://www.jianshu.com/p/b49958e1889d
     http://wuxiaolong.me/2016/06/12/mvpRetrofitRxjava/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值