本篇是 Mvp + okhttp2 + retrofit2 + rxjava2 的簡單封裝
定義一個 BaseView,定義幾個公共的方法
public interface BaseView {
//網(wǎng)絡(luò)請求開始時回調(diào)
void netStart();
//請求報錯時回調(diào)
void netError(String msg);
//結(jié)束時回調(diào)?
void netEnd();
}
定義一個 BaseModel崎弃,什么都沒有操作,只是做一個簡單的聲明
public interface BaseModel {
}
定義一個 BasePresenter疾瓮,做設(shè)置 view 和 model 脖镀,使用 rxjava 管理
public abstract class BasePresenter<V extends BaseView, M extends BaseModel> {
protected V mView;
protected M mModel;
//該類是用戶管理請求的
public RxManager mRxManager = new RxManager();
public void setVM(V mView, M mModel) {
this.mModel = mModel;
this.mView = mView;
}
protected void register(Subscription s) {
mRxManager.add(s);
}
void unregister() {
mRxManager.clear();
}
//設(shè)置 rxjava 線程切換狼电,減少代碼
protected <T> Observable<T> observe(Observable<T> observable) {
return observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
public class RxManager {
//使用 rxjava 中的 CompositeSubscription 來管理
CompositeSubscription mSubscription;
public RxManager() {
mSubscription = new CompositeSubscription();
}
public void add(Subscription s) {
mSubscription.add(s);
}
public void clear() {
mSubscription.clear();
}
}
定義一個 BaseMvpActivity,實現(xiàn)關(guān)聯(lián)
//通過定義泛型 獲取不同的 P肩碟,M
public abstract class BaseMvpActivity<P extends BasePresenter, M extends BaseModel> extends BaseActivity implements BaseView {
public P mPresenter;
public M mModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = getPresenter();
mModel = getModel();
mPresenter.setVM(this, mModel);
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
//頁面銷毀是解注冊
super.onDestroy();
if (mPresenter != null) {
mPresenter.unregister();
}
}
protected abstract P getPresenter();
protected abstract M getModel();
}
定義完這幾個基本差不多强窖,按照谷歌推出的 Mvp 還需要定義一個 Contract 來集中管理,下面假設(shè)實現(xiàn)一個登錄功能削祈,定義一個 LoginContract
public interface LoginContract {
interface View extends BaseView {
//接口調(diào)用成功返回數(shù)據(jù)
void getLogin(LoginBean loginBean);
}
interface Model extends BaseModel {
//定義 model 獲取數(shù)據(jù)
Observable<LoginBean> login(String phone, String psw);
}
abstract class Presenter extends BasePresenter<View, Model> {
//定義 Presenter
public abstract void login(String phone, String psw);
}
}
書寫 LoginModel
public class LoginModel implements LoginContract.Model {
@Override
public Observable<LoginBean> login(String phone, String psw) {
//使用okhttp2 + retrofit2 獲取數(shù)據(jù),后面在說
return Api.getInstance().getApiSevice().login();
}
}
書寫 LoginPresenter
public class LoginPresenter extends LoginContract.Presenter {
@Override
public void login(String phone, String psw) {
//注冊未巫,使用 rxjava 進行線程調(diào)度
register(observe(mModel.login(phone, psw))
.subscribe(new Subscriber<LoginBean>() {
@Override
public void onCompleted() {
mView.netStart();
}
@Override
public void onError(Throwable e) {
mView.netError(e.getMessage());
}
@Override
public void onNext(LoginBean loginBean) {
mView.getLogin(loginBean);
mView.netEnd();
}
}));
}
}
書寫 LoginActivity
//注意實現(xiàn) LoginContract.View 不然會報錯启昧,而且沒有報錯日志
public class LoginActivity extends BaseMvpActivity<LoginPresenter, LoginModel> implements LoginContract.View {
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected LoginPresenter getPresenter() {
//生成具體的 Presenter
return new LoginPresenter();
}
@Override
protected LoginModel getModel() {
//生成具體的Model
return new LoginModel();
}
@Override
protected void initDate() {
}
@Override
protected void initView() {
//LoginActivity 里面就放了一個按鈕點擊
findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.login("", "");
}
});
}
@Override
public void netStart() {
}
@Override
public void netError(String msg) {
}
@Override
public void netEnd() {
}
@Override
public void getLogin(LoginBean loginBean) {
//接口調(diào)用完畢后會回調(diào)這里
}
}
Mvp 的封裝大體就這樣子密末,接下來來看 網(wǎng)絡(luò)請求跛璧。
定義 Api 類
public class Api {
//連接超時時間
private static final int DEFAULT_TIME_OUT = 60;
//讀寫超時
private static final int DEFAULT_READ_TIME_OUT = 60;
private final Retrofit mRetrofit;
private static class SingletonHolder {
private static final Api INSTANCE = new Api();
}
public static Api getInstance() {
return SingletonHolder.INSTANCE;
}
//構(gòu)造函數(shù)中創(chuàng)建 OkHttpClient 和 Retrofit 對象
private Api() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//連接超時時間
builder.writeTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//寫操作 超時時間
builder.readTimeout(DEFAULT_READ_TIME_OUT, TimeUnit.SECONDS);//讀操作 超時時間
//日志攔截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
mRetrofit = new Retrofit.Builder()
.client(builder.build())
.baseUrl(ApiConfigure.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
//創(chuàng)建 ApiServices
public ApiServices getApiSevice() {
return create(ApiServices.class);
}
//創(chuàng)建 Service
private <T> T create(Class<T> clazz) {
return mRetrofit.create(clazz);
}
}
定義 ApiServices 存放請求接口
public interface ApiServices {
@GET("json")
Observable<LoginBean> login();
}
最后使用方式
Api.getInstance().getApiSevice().login();
最后附上 demo地址