项目中用到的 android mvp 源码分享

阅读 2

BaseView

public interface IBaseView {

    //Context getContext();

    //显示进度框
    void loadingShow();

    //关闭进度框
    void loadingDismiss();

    //提示错误
    void showMessage(String message);
}

BasePresenter

public abstract class BasePresenter<V extends IBaseView> {

    private WeakReference<V> viewRef;

    public BasePresenter(V view) {
        viewRef = new WeakReference<>(view);
    }

    //绑定 view,一般在初始化中调用该方法
    public void attach(V view) {
        viewRef = new WeakReference<>(view);
    }

    public void detach() {
        if (viewRef != null) {
            viewRef.clear();
            viewRef = null;
        }
    }

    public V getView() {
        return viewRef.get();
    }

    public boolean isViewAttached() {
        return viewRef == null || viewRef.get() == null;
    }

}

TopicContract

public interface TopicContract {

    interface IView extends IBaseView {
        void onSuccess(List<TopicBean> bean);
    }

    interface IPresenter {
        //列表
        void loadItems(int groupId, int pageIndex);
        //强制刷新缓存
        void refreshCache();
    }
}

TopicPresenter

public class TopicPresenter extends BasePresenter<TopicContract.IView> implements TopicContract.IPresenter {

    public TopicPresenter(TopicContract.IView view) {
        super(view);
    }

    @Override
    public void loadItems(int groupId, int pageIndex) {

        if (isViewAttached()) {
            return;
        }

        getView().loadingShow();

        String cacheKey = formatCacheKey(groupId, pageIndex);

        RetrofitCache.INSTANCE.subscribeTo(cacheKey,
                ApiFactory.getInstance().getApi().getTopicList(groupId, pageIndex, Conf.PAGE_SIZE),
                () -> getView().loadingDismiss(),
                result -> getView().onSuccess(result.getData()),
                new TypeToken<HttpResult<List<TopicBean>>>(){}.getType());
    }
}

BaseFragment ,activity同样

public abstract class MvpFragment<V extends IBaseView, P extends BasePresenter<V>, VB extends ViewBinding> extends BaseFragment<VB> implements IBaseView {

    protected P presenter;
    protected abstract P createPresenter();

    @Override
    public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle state) {
        presenter = createPresenter();
        return super.onCreateView(inflater, container, state);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (presenter != null) {
            presenter.detach();
        }
    }
}
各位看官,如果你觉得本文不错,请支持一下~