Retrifit2+RxJava2 实现MVP

第1步 在build.gradle中引入

   // Retrofit库

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

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

    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

    // Okhttp库

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

    

    implementation 'io.reactivex.rxjava2:rxjava:2.1.5'

    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

   (网络权限:    <uses-permission android:name="android.permission.INTERNET"/>)

第2步 初始化和Base创建

2.1 LogInterceptor

import android.util.Log;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;

public class LogInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Log.e("info", String.format("%1$s->%2$s", request.method(), request.url()));
        if (request.headers() != null) {
            Log.e("info", "Headers:" + request.headers());
        }
        if (request.body() != null) {
            Log.e("info", "RequestBody:" + bodyToString(request.body()));
        }
        Response response = chain.proceed(chain.request());
        MediaType mediaType = response.body().contentType();
        String responseBody = response.body().string();
        Log.e("info", "ResponseBody:" + responseBody);
        return response.newBuilder().body(ResponseBody.create(mediaType, responseBody)).build();
    }

    private String bodyToString(final RequestBody request) {
        if (request != null) {
            try {
                final RequestBody copy = request;
                final Buffer buffer = new Buffer();
                copy.writeTo(buffer);
                return buffer.readUtf8();
            } catch (final IOException e) {
                Log.e("info", "Did not work.");
            }
        }
        return null;
    }
}

2.2 ApiManager:

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiManager {

    private OkHttpClient mOkHttpClient;
    private static String mBaseUrl = "http://www.gwadarpro.com";
    private static int mTimeout = 20;
    private static ApiManager mInstance = new ApiManager();
    private Retrofit mRetrofit;

    public static ApiManager getInstance() {
        return mInstance;
    }

    private ApiManager() {

    }

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

    private Retrofit getRetrofit() {
        if (mRetrofit == null) {
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(mBaseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(getOkHttpClient())
                    .build();
        }
        return mRetrofit;
    }


    private OkHttpClient getOkHttpClient() {
        if (mOkHttpClient == null) {
            mOkHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(mTimeout, TimeUnit.SECONDS)
                    .readTimeout(mTimeout, TimeUnit.SECONDS)
                    .writeTimeout(mTimeout, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .addInterceptor(new LogInterceptor())
                    .build();
        }
        return mOkHttpClient;
    }
}

2.3 ApiService(定义接口地址、参数):

import com.jlncjf.retrofit2demo.model.LoginBean;

import io.reactivex.Observable;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface ApiService {
    /**
     * 登录
     *
     * @param username     用户名
     * @param password     密码
     * @param type         登录类型
     * @param google_token 谷歌推送token
     * @return
     */
    @FormUrlEncoded
    @POST("/mobile/index.php?act=login&op=index")
    Observable<LoginBean> login(@Field("username") String username, @Field("password") String password, @Field("type") String type, @Field("google_token") String google_token);
}

2.4 ApiObserver

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

public class ApiObserver<T> implements Observer<T> {


    private final ApiCallback<T> mCallback;

    public ApiObserver(ApiCallback<T> callback) {
        this.mCallback = callback;
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

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

    @Override
    public void onNext(T t) {
        if (mCallback != null) {
            mCallback.onNext(t);
        }
    }

    @Override
    public void onComplete() {
        if (mCallback != null) {
            mCallback.onCompleted();
        }
    }

    public static <T> ApiObserver<T> getApiObserver(ApiCallback<T> callback) {
        return new ApiObserver<>(callback);
    }

    public static <T> void subscribe(Observable<T> observable, SimpleCallback<T> callback) {
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getApiObserver(callback));
    }

}

2.5 ApiCallback:

public interface ApiCallback<T> {

    void onNext(T t);

    void onError(Throwable e);

    void onCompleted();

}

2.5 SimpleCallback

import com.jlncjf.retrofit2demo.mvp.View.BaseView;

public abstract class SimpleCallback<T> implements ApiCallback<T> {

    private BaseView mView;

    public SimpleCallback(BaseView mView){
        this.mView = mView;
    }

    @Override
    public void onError(Throwable e) {
        mView.onError(e);
    }

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

2.6 BaseBean(网络请求返回):

public class BaseBean {
    private int errCode;
    private String errMess;

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }

    public String getErrMess() {
        return errMess;
    }

    public void setErrMess(String errMess) {
        this.errMess = errMess;
    }
}

2.7 BaseView:

public interface BaseView {
    void onError(Throwable e);

    void onCompleted();
}

2.8 IPresenter

import com.jlncjf.retrofit2demo.mvp.View.BaseView;

public interface IPresenter<T extends BaseView> {
    void attachView(T view);
    void detachView();
}

2.9 BasePresenter:

import com.jlncjf.retrofit2demo.mvp.View.BaseView;

public class BasePresenter<T extends BaseView> implements IPresenter<T> {
    protected T mView;

    @Override
    public void attachView(T view) {
        mView = view;
    }

    @Override
    public void detachView() {
        mView = null;
    }
}

2.10 BaseActivity:

import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.jlncjf.retrofit2demo.mvp.Presenter.BasePresenter;
import com.jlncjf.retrofit2demo.mvp.View.BaseView;

public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {
    protected T mPresenter;
    protected BaseActivity mContext;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(getRootViewId());
        initPresenter();
        if (mPresenter != null) {
            mPresenter.attachView(this);
        }
        initView();
        initData();
    }

    public abstract @LayoutRes
    int getRootViewId();

    public abstract void initView();

    public abstract void initPresenter();

    public abstract void initData();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }
}

2.11 Api

import com.jlncjf.retrofit2demo.model.LoginBean;


public class Api {

    private static ApiService apiService;

    private Api() {
        throw new AssertionError();
    }

    private static ApiService getApiService() {
        if (apiService == null) {
            apiService = ApiManager.getInstance().getApiService(ApiService.class);
        }
        return apiService;
    }

    public static void login(String username, String password, String type, String google_token, SimpleCallback<LoginBean> callback) {
        ApiObserver.subscribe(getApiService().login(username, password, type, google_token), callback);
    }
}

3、具体实现

3.1 LoginBean(登录返回对应的实体类)

public class LoginBean extends BaseBean{

    private DataBean data;

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
     
        private String nickname;

        public String getNickname() {
            return nickname;
        }

        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    }
}

3.2 ILoginView(定义View中需要的接口,比如拿到数据以后)

import com.jlncjf.retrofit2demo.model.LoginBean;

public interface ILoginView extends BaseView {
    void onLoginData(LoginBean bean);
}

3.3 LoginPresenter

import com.jlncjf.retrofit2demo.Api;
import com.jlncjf.retrofit2demo.mvp.View.ILoginView;
import com.jlncjf.retrofit2demo.SimpleCallback;
import com.jlncjf.retrofit2demo.mvp.model.LoginBean;

public class LoginPresenter extends BasePresenter<ILoginView> {
    public void login(String username, String password, String type, String google_token) {
        Api.login(username, password, type, google_token, new SimpleCallback<LoginBean>(mView) {
            @Override
            public void onNext(LoginBean bean) {
                mView.onLoginData(bean);
            }
        });
    }
}

3.4 LoginActivity

import android.widget.TextView;

import com.jlncjf.retrofit2demo.mvp.Presenter.LoginPresenter;
import com.jlncjf.retrofit2demo.mvp.View.ILoginView;
import com.jlncjf.retrofit2demo.mvp.model.LoginBean;

public class LoginActivity extends BaseActivity<LoginPresenter> implements ILoginView {
    private static final String TAG = "LoginActivity";
    private TextView tv_result;

    @Override
    public int getRootViewId() {
        return R.layout.activity_main;
    }

    @Override
    public void initView() {
        tv_result = findViewById(R.id.tv_result);
    }

    @Override
    public void initPresenter() {
        mPresenter = new LoginPresenter();
    }

    @Override
    public void initData() {
        mPresenter.login("wangjinqiang", "qq", "0", "token");

    }

    @Override
    public void onLoginData(LoginBean bean) {//根据登录返回的状态码做相应处理
        if (bean.getErrCode() == 200) {
            tv_result.setText(bean.getData().getNickname());
        } else {
            tv_result.setText("errCode:" + String.valueOf(bean.getErrCode()));
        }

    }

    @Override
    public void onError(Throwable e) {
        tv_result.setText(e.getMessage());
        e.printStackTrace();
    }

    @Override
    public void onCompleted() {

    }
}

猜你喜欢

转载自blog.csdn.net/u012954039/article/details/81207875