banner
NEWS LETTER

MVPDemo

Scroll down

写在前面

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 startActivityAndFinish() {
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地址

IM-MvpDemo

MVPDemo

其他文章
目录导航 置顶
  1. 1. 写在前面
  2. 2. Demo地址
请输入关键词进行搜索