Android MVP 弱引用

7
在 MVP 中,我们使用弱引用来保存 Activity 的引用。 WeakReference<Activity> view = new WeakReference<Activity>(activity); 如果我们失去了这个引用,还能找回来吗?
3个回答

4
如果您失去了对Activity的引用,这意味着该活动已被垃圾回收并且不再存在。您无法获得不存在的内容。
例如,如果由于配置更改而发生这种情况,这意味着创建了一个新的activity
您需要一种方法将新创建的视图附加到同一演示文稿上。
如果您正在寻找帮助您的库,请查看mosbynucleus

你需要一种方法来附加新创建的视图,如何实现呢? 非常感谢您的回答。 - Methnani Bilel
1
@MethnaniBilel 这是一个复杂的问题需要解决...看看Mosby和/或Nucles是如何解决它的。 - LordRaydenMK

0

我认为在MVP中根本不应该保存对Activity的引用,无论是强引用还是弱引用都不行!

我猜你是将这个引用存储在Presenter中。为了真正解耦层次,你应该创建一个描述你的ViewActivity)的接口,并使用它来代替activity。

所以你应该这样做:

public interface LoginView {
    displayUsernameError(String error);
    displayPasswordError(String error);
    openMainScreen();
}

您的Activity应该实现上述接口。

public class LoginActivity implements LoginView {
    ...
}

在你的Presenter中,你会有:
class LoginPresenter {
    private LoginView mView;

    public LoginPresenter(LoginView view) {
         mView = view;
    }

    public onLoginButtonClicked(String username, char[] password) {
         ...
         mView.openMainScreen();
    }
}

这样做的即时好处:

  1. 不同的层真正解耦。您可以更改您的Activity(比如说,您决定使用Fragments),而不必触及您的Presenter

  2. 您的Presenter完全可以使用JUnit进行测试!无需使用任何花哨的东西来验证您的交互是否正确,只需使用Mockito来模拟LoginView

还有一点需要注意 - 您确定您希望您的PresenterView存在时间更长吗?在某些情况下,这是无法避免的,但在大多数情况下,它们具有相同的生命周期 - 当View被销毁时,Presenter也应该被销毁。


3
你的mView是对LoginActivity的强引用。 - Ricardo
我认为在MVP中根本不应该保存Activity的引用,无论是强引用还是弱引用都不行!你明白 private LoginView mView; 已经是一个引用了吧? - Farid

0

你最开始是如何设置引用的?

你应该在Activity的onCreate方法中使用setter方法进行设置。 这个“setter”方法通常被称为“attach”或“bind”。

fun attach(view: View) {
   this.view = view
}

因此,当由于配置更改而创建新的Activity时,它将再次将自身设置为Presenter。请注意,您可能也要处理Presenter的新实例。但是,根据您的问题,我相信您想将新创建的Activity附加到同一Presenter实例。如果您正确地设置了Presenter的作用域,这将适用于两种情况:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接