带你一步一步认识MVP -step2

经过上一篇文章的介绍我们已经对mvp有了比较清晰的认识,上一篇博客链接如下 带你一步一步认识MVP -step1 接下来我们就来解决之前mvp遗留的问题。
1. 很多代码是公用反复的,attach detach 每个 Presenter 都要有
2. Activity -> View 的 attach detach 每个 View 层也要有
3.可能有内存泄漏风向(我们的attach传入的view是this)

为了解决这些问题我们需要一些base类的支撑

首先使我们的baseview(没有任何处理的空接口)

public interface BaseView {
}

之后需要一个presenter的base类来支撑一些共通化处理

public class BasePresenter<V extends BaseView> {
    private V mView;

    public void attach(V view) {
        this.mView = view;
    }

    //对象虽然设置为了空 但是根据java内存回收机制该处理还是有内存泄漏风险 model的处理没有
    public void detach() {
        this.mView = null;
    }

    public V getView() {
        return mView;
    }
}

这里我们在base类里面添加了attach和detach的处理,以及提供了getView的处理我们将不再需要定义成员变量view只需调用getView方法获取我们的view
接下来我们需要一个base的activity来统一接管prestnere代码如下

public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView {
    private P mPresenter;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView();
        // 创建 P,创建只能交给 子类,每个 Activity 都不一样
        mPresenter = createPresenter();
        mPresenter.attach(this);

        initView();
        initData();
    }
    // 由子类去实现创建
    protected abstract P createPresenter();

    protected abstract void initData();

    protected abstract void initView();

    //或者实现給view的id调用setContentView方法
    protected abstract void setContentView();

    @Override
    public void onDestroy() {
        super.onDestroy();
        mPresenter.detach();
    }

    public P getPresenter() {
        return mPresenter;
    }
}

这个过程的处理解决了我们之前的问题 在baseActivity我们通过子类的创建生成了mPresenter 在onDestroy中我们调用mPresenter.detach的方法进行解绑,同时提供了getPresenter方法获取我们的presenter对象。下面再看我们的具体实现

首先还是model的处理(跟以前一样没什么特殊处理)

public class UserInfoModel {
    public List<UserInfo> getUserInfo() {
        List<UserInfo> userInfos = new ArrayList<>();
        userInfos.add(new UserInfo("a", "1"));
        userInfos.add(new UserInfo("b", "2"));
        userInfos.add(new UserInfo("c", "3"));
        return userInfos;
    }
}

然后是view(除了继承baseView没什么大的变化)

public interface UserInfoView extends BaseView {
    void onLoading();   // 1.正在加载中

    void onError(); // 2.获取出错了

    void onSucceed(List<UserInfo> userInfo);  // 3.成功了要显示数据
}

之后是 Presenter大家可以看看这个类的变化

public class UserInfoPresenter extends BasePresenter<UserInfoView>{
    private UserInfoModel model;
    public UserInfoPresenter() {
        model = new UserInfoModel();
    }

    public void getDate() {
        try {
            List<UserInfo> userInfos = model.getUserInfo();
            if (getView() == null) return;
            getView().onSucceed(userInfos);
        } catch (Exception e) {
            getView().onError();
        }
    }
}

prestner不再处理attach和detach对view的绑定处理了(这里交给了base去处理),prestnter的代码瞬间简洁了许多
最后使我们的activity的处理

public class MainActivity extends BaseMvpActivity<UserInfoPresenter> implements UserInfoView {

    @Override
    protected UserInfoPresenter createPresenter() {
        return new UserInfoPresenter();
    }

    @Override
    protected void initData() {
        getPresenter().getDate();
    }

    @Override
    protected void initView() {
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void setContentView() {

    }

    @Override
    public void onLoading() {

    }

    @Override
    public void onError() {
        //todo 错误提示
    }

    @Override
    public void onSucceed(List<UserInfo> userInfo) {
        //todo  显示数据列表
        int count = userInfo.size();
    }
}

与之前相比多了一个createPresenter方法返回我们的presenter在我们调用presenter的时候直接调用getPresenter即可不再需要设置成员变量了
以上问题我们貌似就差一点没解决就是内存泄漏的处理,同时我们的model的处理也是有些单薄,带着这些问题我们来查看下一篇博客。
带你一步一步认识MVP -step3

猜你喜欢

转载自blog.csdn.net/u011048906/article/details/80251160