在 MVP 中,我们使用弱引用来保存 Activity 的引用。
WeakReference<Activity> view = new WeakReference<Activity>(activity);
如果我们失去了这个引用,还能找回来吗?WeakReference<Activity> view = new WeakReference<Activity>(activity);
如果我们失去了这个引用,还能找回来吗?我认为在MVP中根本不应该保存对Activity
的引用,无论是强引用还是弱引用都不行!
我猜你是将这个引用存储在Presenter
中。为了真正解耦层次,你应该创建一个描述你的View
(Activity
)的接口,并使用它来代替activity。
所以你应该这样做:
public interface LoginView {
displayUsernameError(String error);
displayPasswordError(String error);
openMainScreen();
}
您的Activity
应该实现上述接口。
public class LoginActivity implements LoginView {
...
}
class LoginPresenter {
private LoginView mView;
public LoginPresenter(LoginView view) {
mView = view;
}
public onLoginButtonClicked(String username, char[] password) {
...
mView.openMainScreen();
}
}
这样做的即时好处:
不同的层真正解耦。您可以更改您的Activity
(比如说,您决定使用Fragments
),而不必触及您的Presenter
。
您的Presenter完全可以使用JUnit
进行测试!无需使用任何花哨的东西来验证您的交互是否正确,只需使用Mockito
来模拟LoginView
。
还有一点需要注意 - 您确定您希望您的Presenter
比View
存在时间更长吗?在某些情况下,这是无法避免的,但在大多数情况下,它们具有相同的生命周期 - 当View
被销毁时,Presenter
也应该被销毁。
private LoginView mView;
已经是一个引用了吧? - Farid你最开始是如何设置引用的?
你应该在Activity的onCreate方法中使用setter方法进行设置。 这个“setter”方法通常被称为“attach”或“bind”。
fun attach(view: View) {
this.view = view
}
因此,当由于配置更改而创建新的Activity时,它将再次将自身设置为Presenter。请注意,您可能也要处理Presenter的新实例。但是,根据您的问题,我相信您想将新创建的Activity附加到同一Presenter实例。如果您正确地设置了Presenter的作用域,这将适用于两种情况:)