2018-3-15 mvp模式修改。(写了一个简单的demo)
看了个mvpdemo 感觉,很多例子接口太多,感觉不是很好。mvp 模式就修改了一下,添加了EventBus 框架,处理了一部分接口。
一般都是登录界面说,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.sys.lostpro.MainActivity">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="10dp"
android:src="@drawable/bg" />
<EditText
android:id="@+id/edit_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/inputusername" />
<EditText
android:id="@+id/edit_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password" />
<TextView
android:id="@+id/but_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/textbg_a"
android:gravity="center"
android:padding="20dp"
android:text="@string/login"
android:textColor="@color/colorAccent"
android:textStyle="bold" />
<TextView
android:id="@+id/msg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="20dp" />
</LinearLayout>
布局如上然后就是到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 项目会一直优化下,反正当练手。
连接 :点击打开链接