美文网首页工作生活
打造简单易用的MVP

打造简单易用的MVP

作者: zhangchunlin | 来源:发表于2019-07-02 09:01 被阅读0次

什么是MVP?

MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的,Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

先看看我的view是怎么封装的

public interface BaseView {
    /**
     * 显示没有网络
     */
    void showNoNetworkView();
    /**
     * 显示网络超时
     */
    void showTimeoutView();
    /**
     * 显示空数据
     */
    void showEmptyView();
    /**
     * 显示错误页面
     */
    void showErrorView();
    /**
     * 显示登陆页面
     */
    void showLoginView();
    /**
     * 显示内容页面
     */
    void showContentView();
}

再看一个简单的Presenter

/**
 * 基本的控制器
 *
 * @param <V> 视图泛型
 */
public class BasePresenter< V extends BaseView> {
    private V mView;
    /**
     * 绑定view,一般在初始化中调用该方法
     */
    public void attachView(V view) {
        this.mView = view;
    }
    /**
     * 断开view,一般在onDestroy中调用
     */
    public void detachView() {
        this.mView = null;
    }
    /**
     * 是否与View建立连接
     * 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接
     */
    public boolean isViewAttached() {
        return mView != null;
    }
    /**
     * 获得View
     * @return V
     */
    public V getView() {
        return mView;
    }
}

最后的关键BaseActivity

/**
 * 泛型参数结束
 *
 * @param <V> 视图类型
 * @param <P> 控制器类型
 */
public abstract class BaseActivity<V extends BaseView,
        P extends BasePresenter<V>> extends AppCompatActivity
        implements BaseView, StateLayout.OnViewRefreshListener {

    protected P mPresenter;
    protected StateLayout mStateLayout;

    protected Object getLayoutView(LayoutInflater inflater) {
        return null;
    }

    protected abstract void onCreated(@Nullable Bundle savedInstanceState);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LayoutInflater inflater = LayoutInflater.from(this);
        Object view = getLayoutView(inflater);
        if (view != null) {
            if (view instanceof View) {
                setContentView((View) view);
            } else if (view instanceof Integer) {
                setContentView((Integer) view);
            }
        } else {
            ContentViewInject.inject(this);
        }
        mStateLayout = findViewById(R.id.stateLayout);
        if (mStateLayout != null) {
            mStateLayout.setRefreshListener(this);
        }
        mPresenter = instancePresenter();
        if (mPresenter != null) {
            mPresenter.attachView((V) this);
        }
        onCreated(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }

    protected P instancePresenter() {
        try {
            ParameterizedType pType = (ParameterizedType) this.getClass()
                    .getGenericSuperclass();
            if (pType != null) {
                Type[] types = pType.getActualTypeArguments();
                if (types.length == 2) {
                    Class<P> pClass = (Class<P>) types[types.length - 1];
                    return pClass.newInstance();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void showNoNetworkView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showNoNetworkView();
        });
    }

    @Override
    public void showTimeoutView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showTimeoutView();
        });
    }

    @Override
    public void showEmptyView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showEmptyView();
        });
    }

    @Override
    public void showErrorView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showErrorView();
        });
    }

    @Override
    public void showLoginView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showLoginView();
        });
    }

    @Override
    public void showContentView() {
        runOnUiThread(() -> {
            if (mStateLayout == null) return;
            mStateLayout.showContentView();
        });
    }
}

最后看一个简单的使用

@ContentView(R.layout.a_login)
public class LoginActivity extends BaseActivity<LoginView, LoginPresenter>
        implements LoginView {

    private EditText mName;
    private EditText mPwd;

    @Override
    protected void onCreated(@Nullable Bundle savedInstanceState) {
        mName = findViewById(R.id.mName);
        mPwd = findViewById(R.id.mPwd);
    }
    @Override
    protected void attachBaseContext(Context newBase) {
        LocaleManager instance = LocaleManager.getInstance();
        Context context = instance.attachBaseContext(newBase);
        super.attachBaseContext(context);
    }
    @Override
    public String getUserName() {
        return mName.getText().toString();
    }
    @Override
    public String getPassword() {
        return mPwd.getText().toString();
    }
    @Override
    public void setUserNameError(String error) {
        mName.setError(error);
    }
    @Override
    public void setPasswordError(String error) {
        mPwd.setError(error);
    }

    public void login(View view) {
        mPresenter.login();
    }

    @Override
    public void refreshClick() {

    }

    @Override
    public void loginClick() {

    }
}

public class LoginPresenter extends BasePresenter<LoginView> {
    public void login() {
        if (!isViewAttached()) {
            return;
        }
        LoginView view = getView();
        String userName = view.getUserName();
        String password = view.getPassword();
    }
}

public interface LoginView extends BaseView {

    String getUserName();

    String getPassword();

    void setUserNameError(String error);

    void setPasswordError(String error);

}

相关文章

网友评论

    本文标题:打造简单易用的MVP

    本文链接:https://www.haomeiwen.com/subject/ghuacctx.html