Android 安卓MVP软件
在mvp中,我们将活动的引用保存在弱引用中。Android 安卓MVP软件,android,mvp,weak-references,Android,Mvp,Weak References,在mvp中,我们将活动的引用保存在弱引用中。 WeakReference视图=新的WeakReference(活动) 如果我们失去了参考资料。我们可以取回它吗?如果您丢失了对活动的引用,则表示该活动已被垃圾收集,并且不再存在。你无法找回不存在的东西 例如,如果由于配置更改而发生这种情况,则意味着创建了一个新的活动 您需要一种将新创建的视图附加到同一演示者的方法 如果您正在寻找库来帮助您,请查看和。我认为您根本不应该在MVP中保存对活动的引用-不管它是硬的还是弱的 我假设您正在演示者中存储此引用。
WeakReference视图=新的WeakReference(活动)代码>
如果我们失去了参考资料。我们可以取回它吗?如果您丢失了对活动的引用,则表示该活动已被垃圾收集,并且不再存在。你无法找回不存在的东西
例如,如果由于配置更改而发生这种情况,则意味着创建了一个新的活动
您需要一种将新创建的视图附加到同一演示者的方法
如果您正在寻找库来帮助您,请查看和。我认为您根本不应该在MVP
中保存对活动的引用-不管它是硬的还是弱的
我假设您正在演示者中存储此引用。要真正解耦层,您应该创建一个描述视图(活动)的界面,并使用它而不是活动
所以你会这样做:
public interface LoginView {
displayUsernameError(String error);
displayPasswordError(String error);
openMainScreen();
}
您的活动
应该从上面实现接口
public class LoginActivity implements LoginView {
...
}
在演示者中,您将拥有:
class LoginPresenter {
private LoginView mView;
public LoginPresenter(LoginView view) {
mView = view;
}
public onLoginButtonClicked(String username, char[] password) {
...
mView.openMainScreen();
}
}
这样做的直接好处:
不同的层实际上是解耦的。您可以更改您的活动
(假设您决定改用片段
),而无需触摸您的演示者
您的演示者仅可使用JUnit进行完全测试!无需使用任何花哨的东西来验证您的交互是否正确,只需简单地用Mockito
来模拟LoginView
还有一点需要注意-您确定希望您的演示者比您的视图寿命长吗?有些情况下无法避免,但在大多数情况下,它们具有相同的寿命-当视图
被破坏时,演示者
也应该被破坏。您最初是如何设置引用的
您应该使用活动的onCreate中的setter方法进行设置。
这种“setter”方法通常称为“attach”或“bind”
因此,当由于配置更改而创建新活动时,它将再次将自身设置为演示者。请注意,您可能正在处理演示者的新实例。但是,基于您的问题,我相信您希望将新创建的活动附加到presenter的同一实例。如果您的演示者范围正确,这将适用于两种情况:)“您需要一种方法来附加新创建的视图”如何执行?谢谢你的夸奖answer@MethnaniBilel这是一个需要解决的复杂问题。。。看看mosby和/或Nucleus,看看他们是如何解决的。你的mView是物流活动的有力参考。
fun attach(view: View) {
this.view = view
}