Android MVP加Retrofit+RxJava
這裏寫了一個小的Demo 運用Mvp加Retrofit+RxJava 進行網絡請求
MVP是模型(Model)、視圖(View)、主持人(Presenter)的縮寫,分別代表項目中3個不同的模塊。
模型(Model):負責處理數據的加載或者存儲,比如從網絡或本地數據庫獲取數據等;
視圖(View):負責界面數據的展示,與用戶進行交互;
主持人(Presenter):相當於協調者,是模型與視圖之間的橋樑,將模型與視圖分離開來。
廢話不多說 直接上代碼
依賴
implementation 'com.squareup.retrofit2:retrofit:2.4.0' //Retrofit2網絡框架 最新版不建議使用 implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //與Retrofit2結合使用的 implementation 'io.reactivex.rxjava2:rxjava:2.+' implementation 'io.reactivex.rxjava2:rxandroid:2.+' implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
service相當於Model層
public interface HomeService { @POST(Urls.TABLIST) Observable<TitleBean> getTitle(); }
自己簡單的封裝了一下Retrofit
public class RetrofitUtils {
private static RetrofitUtils retrofitUtils;
private Retrofit retrofit;
private RetrofitUtils() {
retrofit = new Retrofit.Builder()
.baseUrl(Urls.BASEURL)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static RetrofitUtils getInstance(){
if (retrofitUtils == null) {
synchronized (RetrofitUtils.class){
if (retrofitUtils == null) {
retrofitUtils=new RetrofitUtils();
}
}
}
return retrofitUtils;
}
public HomeService getHomeService(){
return retrofit.create(HomeService.class);
}
}
契約類
public interface HomeContract {
interface View extends BaseView {
void showTitle(TitleBean titleBean);
}
interface Presenter extends BasePresenter<View> {
void getTitleData();
}
}
BasePresenter
public interface BasePresenter<V> {
void attachView(V v);
void detachView();
}
BaseView
public interface BaseView {
void showMsg(String msg);
}
HomePresenter實現了BasePresenter
public class HomePresenter implements HomeContract.Presenter {
private HomeContract.View view;
//解析
@Override
public void getTitleData() {
RetrofitUtils.getInstance().getHomeService().getTitle()
.subscribeOn(Schedulers.io())
.retry()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<TitleBean>() {
@Override
public void accept(TitleBean titleBean) throws Exception {
view.showTitle(titleBean);
}
});
}
//給View層賦值
@Override
public void attachView(HomeContract.View view) {
this.view = view;
}
@Override
public void detachView() {
this.view = null;
}
}
BaseActivity
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity {
private BaseFragment lastFragment;
public T presenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
parsePresenter();
presenter.attachView(this);
initView();
loadData();
}
protected abstract void loadData();
protected abstract void initView();
protected abstract int getLayoutId();
//通過反射獲取所對應的JavaBean
private void parsePresenter() {
Type genericSuperclass = this.getClass().getGenericSuperclass();
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
Class<T> tClass = (Class<T>) actualTypeArguments[0];
try {
presenter = tClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
//view層 HomeActivity
public class MainActivity extends BaseActivity<HomePresenter> implements HomeContract.View {
@Override
protected void loadData() {
presenter.getTitleData();
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void showMsg(String msg) {
Toast.makeText(this, "---MSG---" + msg, Toast.LENGTH_SHORT).show();
}
@Override
public void showTitle(TitleBean titleBean) {
List<TitleBean.DataBean.NewsChannelListBean> newsChannelList = titleBean.getData().getNewsChannelList();
for (TitleBean.DataBean.NewsChannelListBean newsChannelListBean : newsChannelList) {
Log.e("----MAINACTIVITY---", newsChannelListBean.getChannelName());
}
}