Android MVP 模式
16lz
2021-01-23
2018-3-15 mvp模式修改。(写了一个简单的demo)
看了个mvpdemo 感觉,很多例子接口太多,感觉不是很好。mvp 模式就修改了一下,添加了EventBus 框架,处理了一部分接口。
一般都是登录界面说,
<?xml version="1.0" encoding="utf-8"?>
布局如上然后就是到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 模拟了登录名,当成功登录时候,发送消息,过去,主页接口,处理显示出来,取消对话框。
EventBus 消息可以封装三个出来,实现主页 控制接收数据, 主页主要接收两种类型消息,一种对话框显示 隐藏消息,一种实际处理逻辑相关的消息。
Demo 项目会一直优化下,反正当练手。
连接 :点击打开链接
更多相关文章
- Android 抽象回调函数以及接口回调更新UI
- [置顶] Android WebKit消息处理(二)Touch事件的分发处理
- [Android]RecyclerView基本使用+adapter回调接口实现点击事件
- Android学习笔记之网络接口(Http接口,Apache接口,Android接口)
- Android消息队列(三)--多线程与消息处理
- Android的联通性---USB主机模式(一)