Android MVP加Retrofit+RxJava

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());
        }
    }

到這就結束了代碼很詳細 對於初學者很適用 第一次寫請多多見諒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章