ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MVP 结构 --- 小demo展示理解 ```

2022-03-05 11:02:05  阅读:185  来源: 互联网

标签:MVP demo void abstract --- protected Override mPresenter public


项目结构展示

BaseActivity

public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity {
    // T 泛型的本质是参数化类型,可以隐式和自动转为任意类型(数据类型)的参数
    protected T mPresenter;
    private Bundle mSavedInstanceState;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        doBeforeSetContentView();
        setContentView(getLayoutId());

        //mvp
        mPresenter  = getPresenter();
        if(mPresenter != null){
            mPresenter.attachView(this);
        }

        /*EventBus 事件总线 注册
        if(isRegisterEventBus()){
            EventBusUtil.register(this);
        }*/
        
        mSavedInstanceState = savedInstanceState;
        initData();
        initView();
        doAfterInit();
    }

    /**
     * 初始化数据和视图后在 OnCreate 方法中的操作
     */
    protected abstract void doAfterInit();

    /**
     * 初始化视图
     */
    protected abstract void initView();

    /**
     * 初始化数据
     */
    protected abstract void initData();


    /**
     * 是否注册EventBus,注册后才可以订阅事件
     *
     * @return 若需要注册 EventBus,则返回 true;否则返回 false
     */
    protected abstract boolean isRegisterEventBus();

    /**
     * 获取当前活动的Presenter
     *
     * @return 相应的Presenter实例,没有则返回 null
     */
    protected abstract T getPresenter();

    /**
     *  获取当前活动的布局
     *
     * @return 布局id
     */
    protected abstract int getLayoutId();

    /**
     * 在setContentView之前被调用
     */
    protected abstract void doBeforeSetContentView();




    /**
     * 弹出Toast
     *
     * @param content 弹出的内容
     */
    protected void showShortToast(String content) {
        //ToastUtil.showToast(this, content);
    }

    /**
     * 跳转到另一活动
     *
     * @param activity 新活动.class
     */
    protected void jumpToNewActivity(Class activity) {
        Intent intent = new Intent(this, activity);
        startActivity(intent);
    }

    /**
     * 带Bundle的跳转活动
     *
     * @param activity 新活动.class
     * @param bundle
     */
    protected void jump2ActivityWithBundle(Class activity, Bundle bundle) {
        Intent intent = new Intent(this, activity);
        startActivity(intent, bundle);
    }

    /**
     * 获取 onCreate 方法中的 Bundle 参数 savedInstanceState
     *
     * @return
     */
    protected Bundle getSavedInstanceState() {
        return mSavedInstanceState;
    }
}

BaseFragment

public abstract class BaseFragment<V extends BasePresenter> extends Fragment {

    protected V mPresenter;   //该Fragment对应的Presenter

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPresenter = getPresenter();
        if (mPresenter != null) {
            mPresenter.attachView(this);
        }

        if (isRegisterEventBus()) {
            //EventBusUtil.register(this);
        }
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
        initView();
        doInOnCreate();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(getLayoutId(), container, false);  //第三个参数一定要设为false;
        return view;
    }

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

        if (isRegisterEventBus()) {
            //EventBusUtil.unregister(this);
        }
    }

    /**
     * 获取fragment布局
     *
     * @return 布局id
     */
    protected abstract int getLayoutId();

    /**
     * 在进行初始化布局前初始化相关数据
     */
    protected abstract void initData();

    /**
     * 初始化视图
     */
    protected abstract void initView();

    /**
     * 在onCreate方法中执行的操作
     */
    protected abstract void doInOnCreate();

    /**
     * 获取Presenter实例
     *
     * @return 相应的Presenter实例,没有则返回 null
     */
    protected abstract V getPresenter();


    /**
     * 是否注册EventBus,注册后才可以订阅事件
     *
     * @return 若需要注册 EventBus,则返回 true;否则返回 false
     */
    protected abstract boolean isRegisterEventBus();


    /**
     * 显示 Toast
     *
     * @param content
     */
    protected void showShortToast(String content) {
       // ToastUtil.showToast(getContext(), content);
    }

    /**
     * 跳转到活动
     *
     * @param activity 新活动.class
     */
    protected void jump2Activity(Class activity) {
        startActivity(new Intent(getContext(), activity));
    }

    /**
     * 带Bundle的跳转活动
     *
     * @param activity 新活动.class
     * @param bundle
     */
    protected void jump2ActivityWithBundle(Class activity, Bundle bundle) {
        Intent intent = new Intent(getContext(), activity);
        startActivity(intent, bundle);
    }

}

IReadContract

public interface IReadContract {
    interface View{
        void loadTxtSuccess(String text);
        void loadTxtError(String errorMsg);
    }

    //Presenter  负责model 和view 的交互
    interface Presenter{
        void loadTxtSuccess(String text);
        void loadTxtError(String errorMsg);

        void loadTxt(String filePath);
    }

    interface Model{
        void loadTxt(String filePath);
    }
}

BasePresenter

public class BasePresenter<V> {
    private V view;

    // 添加布局
    public void attachView(V view){
        this.view = view;
    }

    //释放布局
    public void detachView(){
        this.view = null;
    }

    protected  boolean isAttachView(){
        return view != null;
    }

    protected V getMvpView(){
        return view;
    }
}

ReadPresenter

public class ReadPresenter extends BasePresenter<IReadContract.View> implements  IReadContract.Presenter {
    private IReadContract.Model mModel;

    public ReadPresenter() {
        mModel = new ReadModel(this);
    }

    //model获取数据后,View上数据的改变
    @Override
    public void loadTxtSuccess(String text) {
        if (isAttachView()) {
            getMvpView().loadTxtSuccess(text);//拿到当前视图id,可以操作控件的属性
            //Log.d("tww","ReadPresenter-->getMvpView()");
        }
    }

    @Override
    public void loadTxtError(String errorMsg) {

    }

    //获取数据
    @Override
    public void loadTxt(String filePath) {
        mModel.loadTxt(filePath);
    }


}

ReadModel

public class ReadModel implements IReadContract.Model {

    private IReadContract.Presenter mPresenter;

    public ReadModel(IReadContract.Presenter mPresenter) {
        this.mPresenter = mPresenter;
    }

    @Override
    public void loadTxt(String filePath) {
        //处理数据
        Log.d("tww","ReadModel-->"+filePath);
        mPresenter.loadTxtSuccess("ReadModel-->mPresenter.loadTxtSuccess");
    }
}

ReadActivity

public class ReadActivity extends BaseActivity<ReadPresenter> implements IReadContract.View {
    private Button mButton;

    @Override
    protected void doAfterInit() {

    }

    @Override
    protected void initView() {
        mButton = findViewById(R.id.bili_vp);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.loadTxt("loading...");
            }
        });
    }

    @Override
    protected void initData() {

    }

    @Override
    protected boolean isRegisterEventBus() {
        return false;
    }

    @Override
    protected ReadPresenter getPresenter() {
        return new ReadPresenter();
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_read;
    }

    @Override
    protected void doBeforeSetContentView() {

    }

    @Override
    public void loadTxtSuccess(String text) {
        Log.d("tww","ReadActivity:"+text);
    }

    @Override
    public void loadTxtError(String errorMsg) {

    }
}

标签:MVP,demo,void,abstract,---,protected,Override,mPresenter,public
来源: https://www.cnblogs.com/kato-T/p/15967234.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有