android的mvp详解
model层:
model的一个接口
IHomeModel.java
public interface IHomeModel {
void loadAdsData(Subscriber<HomeOneItemEntity> subscriber);
void loadAdsDataTwo(Subscriber<HomeTwoItemEntity> subscriber);
void loadAdsDataThree(Subscriber<HomeThreeItemEntity> subscriber);
void loadAdsDataFour(Subscriber<HomeFourItemEntity> subscriber);
void loadAdsDataFive(Subscriber<HomeFiveItemEntity> subscriber);
}
homeModelImpl.java
public class HomeModelImpl implements IHomeModel {
@Override
public void loadAdsData(Subscriber<HomeOneItemEntity> subscriber)
{
// 调用服务返回Observable
Observable<HomeOneItemEntity> app_banner = ApiServiceManager.getInstance()
.getHotelService()
.homeOneItem("app_banner");
app_banner.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override
public void loadAdsDataTwo(Subscriber<HomeTwoItemEntity> subscriber) {
Observable<HomeTwoItemEntity> app_banner = ApiServiceManager.getInstance()
.getHotelService()
.homeTwoItem();
app_banner.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override
public void loadAdsDataThree(Subscriber<HomeThreeItemEntity> subscriber) {
Observable<HomeThreeItemEntity> app_banner = ApiServiceManager.getInstance()
.getHotelService()
.homeThreeItem("app_under_top");
app_banner.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override
public void loadAdsDataFour(Subscriber<HomeFourItemEntity> subscriber) {
Observable<HomeFourItemEntity> app_banner = ApiServiceManager.getInstance()
.getHotelService()
.homeFourItem(10,1);
app_banner.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override
public void loadAdsDataFive(Subscriber<HomeFiveItemEntity> subscriber) {
Observable<HomeFiveItemEntity> app_banner = ApiServiceManager.getInstance()
.getHotelService()
.homeFiveItem();
app_banner.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.unsubscribeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
Presenter层
Presenter的基类
BasePresenter.java
public abstract class BasePresenter<IV extends BaseView>
{
Reference<IV> mViewRef;//View接口类型的弱引用
CompositeSubscription mCompositeSubscription;
@UiThread
public void attachView(IV v)
{
mViewRef = new WeakReference<>(v);
}
public IV getView()
{
return mViewRef.get();
}
public boolean isAttchView()
{
return mViewRef != null && mViewRef.get() != null;
}
@UiThread
public void detachView()
{
onUnsubscribe();
if (mViewRef != null)
{
mViewRef.clear();
mViewRef = null;
}
}
public static class MvpViewNotAttachedException extends RuntimeException
{
public MvpViewNotAttachedException()
{
super("Please call Presenter.attachView(MvpView) before" +
" requesting data to the Presenter");
}
}
//RXjava取消注册,以避免内存泄露
public void onUnsubscribe()
{
if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions())
{
mCompositeSubscription.unsubscribe();
}
}
//RXjava注册
public void addSubscription(Subscription subscriber)
{
if (mCompositeSubscription == null)
{
mCompositeSubscription = new CompositeSubscription();
}
mCompositeSubscription.add(subscriber);
}
}
HomePresenter.java
public class HomePresenter extends BasePresenter<IHomeView> {
private IHomeModel model;
public HomePresenter()
{
model = new HomeModelImpl();
}
/**
* 加载广告数据
*/
public void loadAdsData()
{
model.loadAdsData(new BaseSubscriber<HomeOneItemEntity>()
{
//请求数据失败
@Override
public void onError(ExceptionHandle.ResponeThrowable e)
{
getView().onFail(e);
}
//请求数据成功
@Override
public void onSuccess(HomeOneItemEntity result)
{
getView().onSuccess(result);
}
//请求数据完成
@Override
public void onFinish()
{
getView().onFinish();
}
});
}
/**
* 第二个item
*/
public void loadAdsDataTwo()
{
model.loadAdsDataTwo(new BaseSubscriber<HomeTwoItemEntity>()
{
//请求数据失败
@Override
public void onError(ExceptionHandle.ResponeThrowable e)
{
getView().onFail(e);
}
//请求数据成功
@Override
public void onSuccess(HomeTwoItemEntity result)
{
getView().onSuccess(result);
}
//请求数据完成
@Override
public void onFinish()
{
getView().onFinish();
}
});
}
/**
* 第三个item
*/
public void loadAdsDataThree()
{
model.loadAdsDataThree(new BaseSubscriber<HomeThreeItemEntity>()
{
//请求数据失败
@Override
public void onError(ExceptionHandle.ResponeThrowable e)
{
getView().onFail(e);
}
//请求数据成功
@Override
public void onSuccess(HomeThreeItemEntity result)
{
getView().onSuccess(result);
}
//请求数据完成
@Override
public void onFinish()
{
getView().onFinish();
}
});
}
/**
* 第四个item
*/
public void loadAdsDataFour()
{
model.loadAdsDataFour(new BaseSubscriber<HomeFourItemEntity>()
{
//请求数据失败
@Override
public void onError(ExceptionHandle.ResponeThrowable e)
{
getView().onFail(e);
}
//请求数据成功
@Override
public void onSuccess(HomeFourItemEntity result)
{
getView().onSuccess(result);
}
//请求数据完成
@Override
public void onFinish()
{
getView().onFinish();
}
});
}
/**
* 第五个item
*/
public void loadAdsDataFive()
{
model.loadAdsDataFive(new BaseSubscriber<HomeFiveItemEntity>()
{
//请求数据失败
@Override
public void onError(ExceptionHandle.ResponeThrowable e)
{
getView().onFail(e);
}
//请求数据成功
@Override
public void onSuccess(HomeFiveItemEntity result)
{
getView().onSuccess(result);
}
//请求数据完成
@Override
public void onFinish()
{
getView().onFinish();
}
});
}
}
View层
fragment的基类
MvpLazyFragment.java
public abstract class MvpLazyFragment<IV extends BaseView, P extends BasePresenter<IV>>
extends BaseLazyFragment implements BaseView
{
public P mPresenter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (mPresenter == null)
{
mPresenter = createPresenter();
mPresenter.attachView((IV) this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroyView()
{
super.onDestroyView();
if (mPresenter != null)
{
mPresenter.detachView();
}
}
@Override
@NonNull
public abstract P createPresenter();
}
fragment的一个实现
HomeFragment.java
public class HomeFragment extends MvpLazyFragment<IHomeView, HomePresenter> implements IHomeView {
@BindView(R.id.homeXRecyclerView)
XRecyclerView homeXRecyclerView;
private HomeAdaper homeAdaper;
@NonNull
@Override
public HomePresenter createPresenter() {
return new HomePresenter();
}
@Override
public void initView() {
mPresenter.loadAdsData();
mPresenter.loadAdsDataTwo();
mPresenter.loadAdsDataThree();
mPresenter.loadAdsDataFour();
mPresenter.loadAdsDataFive();
homeAdaper = new HomeAdaper(getContext());
homeXRecyclerView.setAdapter(homeAdaper);
homeXRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
homeXRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
mPresenter.loadAdsData();
mPresenter.loadAdsDataTwo();
mPresenter.loadAdsDataThree();
mPresenter.loadAdsDataFour();
mPresenter.loadAdsDataFive();
}
@Override
public void onLoadMore() {
}
});
}
@Override
public void initData() {
}
@Override
public int getLayoutId() {
return R.layout.fragment_home;
}
@Override
public void onFail(ExceptionHandle.ResponeThrowable e) {
Log.e("a", "请求网络失败");
}
@Override
public void onFinish() {
Log.e("a", "请求网络结束");
}
@Override
public void onSuccess(HomeOneItemEntity entity) {
Log.e("a", "HomeOneItemEntity请求网络成功");
homeAdaper.setOneItem(entity.getData().getList());
}
@Override
public void onSuccess(HomeTwoItemEntity entity) {
Log.e("a", "HomeTwoItemEntity请求网络成功");
homeAdaper.setTwoItem(entity.getData().getIcons());
}
@Override
public void onSuccess(HomeThreeItemEntity entity) {
Log.e("a", "HomeThreeItemEntity请求网络成功");
homeAdaper.setThreeItem(entity.getData().getList());
}
@Override
public void onSuccess(HomeFourItemEntity entity) {
Log.e("a", "HomeFourItemEntity请求网络成功");
homeAdaper.setFourItem(entity.getData().getTopics());
homeXRecyclerView.refreshComplete();
}
@Override
public void onSuccess(HomeFiveItemEntity entity) {
homeAdaper.setFiveItem(entity.getData());
}
@OnClick(R.id.homeSeek)
public void onClick() {
startActivity(new Intent(getActivity(), SeekActivity.class));
}
}