写在前面
MVP在实现代码简洁的同时,额外增加了大量的接口、类,不方便进行管理,于是就出现了Contract
将Model、View、Presenter 进行约束管理,方便后期类的查找、维护。
1.创建LoginContract
/**
* Contract类管理相关模块方法
*/
class LoginContract {
interface Presenter : BasePresenter {
fun login(username: String, password: String)
}
interface View {
fun onUserNameError()
fun onPasswordError()
fun onStartLogin()
fun onLoginInSuccess()
fun onLoginInFailed()
}
}
2.创建BaseActivity
abstract class BaseActivity : AppCompatActivity() {
val progressDialog by lazy {
ProgressDialog(this)
}
//隐藏软键盘
val inputMethodManager by lazy {
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutResId())
init()
}
open fun init() {
}
abstract fun getLayoutResId(): Int
fun showProgress(message: String) {
progressDialog.setMessage(message)
progressDialog.show()
}
fun dismissProgress() {
progressDialog.dismiss()
}
//隐藏软键盘
fun hideSoftKeyboard() {
inputMethodManager.hideSoftInputFromWindow(currentFocus.windowToken, 0)
}
//在Ui线程弹出toast
protected fun MyToast(message: String) {
runOnUiThread { toast(message) }
}
//跳转后finish原来的
inline fun
startActivity
finish()
}
}
3.创建BasePresenter
interface BasePresenter {
//创建伴生对象
companion object {
val handler by lazy {
Handler(Looper.getMainLooper())
}
}
// 用以子线程通知主线程
fun uiThread(f: () -> Unit) {
handler.post { f() }
}
}
4.创建LoginPresenter
class LoginPresenter(val view: LoginContract.View) : LoginContract.Presenter {
override fun login(username: String, password: String) {
if (username.isValidUserName()) {
if (password.isValidPassword()) {
//密码合法
view.onStartLogin()
loginEaseMob(username, password)
} else view.onPasswordError()
} else view.onUserNameError()
}
private fun loginEaseMob(username: String, password: String) {
EMClient.getInstance().login(username, password, object : EMCallBackAdapter() {
//在子线程回调的
override fun onSuccess() {
EMClient.getInstance().groupManager().loadAllGroups()
EMClient.getInstance().chatManager().loadAllConversations()
//在主线程中通知主线程
uiThread {
view.onLoginInSuccess()
}
}
override fun onError(p0: Int, p1: String?) {
uiThread {
view.onLoginInFailed()
}
}
})
}
}
5.创建LoginActivity
class LoginActivity : BaseActivity(), LoginContract.View {
val presenter = LoginPresenter(this)
override fun init() {
super.init()
login.setOnClickListener {
loginIn()
}
btn_register.setOnClickListener {
startActivity<RegisterActivity>()
}
password.setOnEditorActionListener { _, _, _ ->
loginIn()
true
}
}
private fun loginIn() {
//隐藏软键盘
hideSoftKeyboard()
if (hasWriteExternalStoragePermission()) {
val usernameString = username.text.trim().toString()
val passwordString = password.text.trim().toString()
presenter.login(usernameString, passwordString)
} else applyWriteExternalStoragePermission()
}
//动态权限申请
private fun applyWriteExternalStoragePermission() {
val permission = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permission, 0)
}
private fun hasWriteExternalStoragePermission(): Boolean {
val result =
ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
return result == PackageManager.PERMISSION_DENIED
}
override fun onUserNameError() {
username.error = "用户名不合法"
}
override fun onPasswordError() {
password.error = "密码不合法"
}
override fun onStartLogin() {
//弹出进度条
showProgress("登录中")
}
override fun onLoginInSuccess() {
dismissProgress()
startActivityAndFinish<MainActivity>()
}
override fun onLoginInFailed() {
dismissProgress()
toast("登录失败")
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//用户同意权限
loginIn()
} else toast("权限被拒绝")
}
override fun getLayoutResId(): Int = R.layout.activity_login
}
Demo地址
- 本文链接: https://blog.hansong.icu/2019/10/23/mvpDemo/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。