我可以在MVP视图中执行逻辑操作,但是据我所知,根据MVP模式,视图应尽可能地愚蠢. MVP模型可以包含android专用术语吗?如果没有,那么我该如何在MVP模型中使用活动上下文?
最佳答案
让我们假设基于MVP模式的登录功能的实现,其中模型(LoginInteractor)将使用活动上下文.
因此,我们必须实现以下类:LoginActivity,LoginPresenterImpl和LoginInteractorImpl(作为MVP模型).如MVP所述,我们将在View和Presenter之间定义一个合同.我们将它们命名为LoginView和LoginPresenter.此外,我们还将为Interactor类LoginInteractor定义一个接口.
LoginActivity引用了LoginPresenter,将在其中处理所有逻辑.具体实现LoginInsenterImpl引用了LoginView和LoginInteractor.交互器的具体实现LoginInteractorImpl将使用活动上下文来初始化特定于Android的资源,这些资源对于收集登录过程中所需的数据是必需的.
这样,presenter逻辑与android资源无关,可以很容易地进行单元测试.
示例代码段(请注意,演示者如何只知道抽象的Interactor.具体的Interactor是在视图中初始化的,并提供其活动上下文.)
首先,我们为所有类别定义合同:
interface LoginView {
fun onLoginSuccess()
fun onLoginFailed()
fun showErrorMessage(error: String)
//...........
}
interface LoginPresenter {
fun proceedLogin(username: String,password: String)
//............
}
interface LoginInteractor {
fun getUserByUsername(username: String) : User
fun getUserCredentials() : Credential
//............
}
然后,针对他们的具体实现:
class LoginActivity : LoginView,AppCompatActivity() {
private lateinit var presenter: LoginPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// initialize presenter
presenter = LoginPresenterImpl(
view = this,interactor = LoginInteractorImpl(this)
)
// your code goes here
}
override fun onLoginSuccess() {
// your code goes here
}
override fun onLoginFailed() {
// your code goes here
}
override fun showErrorMessage(error: String) {
// your code goes here
}
}
class LoginPresenterImpl(
private val view: LoginView,private val interactor: LoginInteractor
) : LoginPresenter {
override fun proceedLogin(username: String,password: String) {
// your custom login logic goes here
// call interactor to get data
// process data
// give Feedback to view
}
}
class LoginInteractorImpl(context: Context) : LoginInteractor {
override fun getUserCredentials() {
// your code goes here
}
override fun getUserByUsername(username: String) {
// use context to access local DB...
}
}
注意:为了更好地分离关注点,使用依赖项注入解决方案将消除View初始化所有其他对象这一事实引起的问题.