Android MVP 模式

2018-3-15 mvp模式修改。(写了一个简单的demo)

看了个mvpdemo 感觉,很多例子接口太多,感觉不是很好。mvp 模式就修改了一下,添加了EventBus 框架,处理了一部分接口。

Android MVP 模式_第1张图片

一般都是登录界面说,




    

    

    

    

    

布局如上然后就是到activity了。

package com.sys.lostpro;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.sys.lostpro.mvplost.model.entity.AppMangerInfo;
import com.sys.lostpro.mvplost.model.eventbusmsg.AppUserInfoMsg;
import com.sys.lostpro.mvplost.model.eventbusmsg.ExceptionInfo;
import com.sys.lostpro.mvplost.model.eventbusmsg.ProgressInfo;
import com.sys.lostpro.mvplost.presenter.compl.IMainViewCompl;
import com.sys.lostpro.mvplost.presenter.ipresenter.IMainView;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.edit_username)
    EditText editUsername;
    @BindView(R.id.edit_password)
    EditText editPassword;
    @BindView(R.id.but_login)
    TextView butLogin;
    private IMainView iMainView;
    @BindView(R.id.msg)
    TextView msg;
    private ProgressDialog progressDialog;

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void showProgress(ProgressInfo messageEvent) {
        if (messageEvent != null && messageEvent.getShowProgress() == 1) {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setMessage("加载中");
                progressDialog.create();
                progressDialog.setCanceledOnTouchOutside(false);
                progressDialog.setCancelable(false);
                progressDialog.show();
            } else {
                if (!progressDialog.isShowing()) {
                    progressDialog.show();
                }
            }
        } else {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        }

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void subAppUserInfo(AppUserInfoMsg messageEvent) {
        if (messageEvent != null) {
            if (messageEvent.getEntity() instanceof AppMangerInfo) {
                AppMangerInfo appUserInfo = (AppMangerInfo) messageEvent.getEntity();
                msg.setText("欢迎" + appUserInfo.getUsername() + "登录");
            } else if (messageEvent.getEntity() instanceof ExceptionInfo) {
                msg.setText("发生异常");
            } else {

            }
        }
    }

    @OnClick(R.id.but_login)
    public void but_login(View view) {
        iMainView.login(editUsername.getText().toString(), editPassword.getText().toString());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        EventBus.getDefault().register(this);
        iMainView = new IMainViewCompl();
    }
}

Activity 里面引用了EventBus 的框架,具体用法就是 注册,监听,注销。 这里 好似mvp 模式里创建一下接口Presenter 的实现类。 里面我添加了一个对话框,模拟登录,

接下来就是 IMainPresenterCompl 实现类,

package com.sys.lostpro.mvplost.presenter.compl;

import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;

import com.sys.lostpro.mvplost.model.eventbusmsg.ProgressInfo;
import com.sys.lostpro.mvplost.model.modelimpl.LoginModel;
import com.sys.lostpro.mvplost.model.modelimpl.LoginModelImpl;
import com.sys.lostpro.mvplost.presenter.ipresenter.IMainView;

import org.greenrobot.eventbus.EventBus;


public class IMainViewCompl implements IMainView {
    private LoginModel loginModel;

    public IMainViewCompl() {
        loginModel = new LoginModelImpl();
    }

    /**
     * 处理逻辑了。
     *
     * @param username
     * @param password
     */
    @Override
    public void login(final String username, final String password) {
        Log.e("login", username + password);
        if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
            return;
        } else {
            EventBus.getDefault().post(new ProgressInfo(1));
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    loginModel.checkUser(username, password);
                }
            }, 5000);

        }
    }
}
 
  

里面相当于一个拦截器的思路,真实处理是loginModel 的实现。

package com.sys.lostpro.mvplost.model.modelimpl;

import com.sys.lostpro.mvplost.model.entity.AppMangerInfo;
import com.sys.lostpro.mvplost.model.eventbusmsg.AppUserInfoMsg;
import com.sys.lostpro.mvplost.model.eventbusmsg.ExceptionInfo;
import com.sys.lostpro.mvplost.model.eventbusmsg.ProgressInfo;

import org.greenrobot.eventbus.EventBus;


public class LoginModelImpl implements LoginModel {
    @Override
    public void checkUser(String username, String password) {

        if (username.equals("admin") && password.equals("admin")) {
            EventBus.getDefault().post(new AppUserInfoMsg(1, "appmanager", new AppMangerInfo(username, password)));
        } else {
            EventBus.getDefault().post(new AppUserInfoMsg(404, "excetption", new ExceptionInfo(404, "null exception")));
        }
        EventBus.getDefault().post(new ProgressInfo(2));
    }
}
这里用admin 模拟了登录名,当成功登录时候,发送消息,过去,主页接口,处理显示出来,取消对话框。

Android MVP 模式_第2张图片 

EventBus 消息可以封装三个出来,实现主页 控制接收数据, 主页主要接收两种类型消息,一种对话框显示 隐藏消息,一种实际处理逻辑相关的消息。

Demo 项目会一直优化下,反正当练手。 

连接 :点击打开链接

你可能感兴趣的:(Android,GIT,Android,例子)