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