Android 安卓MVP软件

Android 安卓MVP软件,android,mvp,weak-references,Android,Mvp,Weak References,在mvp中,我们将活动的引用保存在弱引用中。 WeakReference视图=新的WeakReference(活动) 如果我们失去了参考资料。我们可以取回它吗?如果您丢失了对活动的引用,则表示该活动已被垃圾收集,并且不再存在。你无法找回不存在的东西 例如,如果由于配置更改而发生这种情况,则意味着创建了一个新的活动 您需要一种将新创建的视图附加到同一演示者的方法 如果您正在寻找库来帮助您,请查看和。我认为您根本不应该在MVP中保存对活动的引用-不管它是硬的还是弱的 我假设您正在演示者中存储此引用。

在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
    }