Android MVP 如何将数据从模型返回给演示者
Android MVP How to get data back from model to presenter
经过一段时间开发个人 Android 应用程序后,我发现 Activity 通常会变得非常大,并且逻辑和 UI 操作混在一起。
所以寻找一种方法将逻辑与 UI 分开我遇到了 MVP 模式,现在我正试图在我要开发的应用程序中实现它。
所以基本上这就是我的方法:
我现在面临的问题是,为了将数据从模型返回给演示者,我会做这样的事情:
public static ModelManager (OnePresenter presenter)
{
localPresenter = presenter
}
然后:
public onReturnData(){
localPresenter.returnData();
}
问题是模型管理器可以随时从任何演示者调用,所以我如何传递通用演示者的引用?
非常感谢。
老实说,我认为您的方法不是处理此问题的最佳方法。实际上,您可以只使用 observer 模式 或 EventBus 来通知 presenters 何时收到数据.这样你就可以让你的 presenter 与 model 分开..这应该会让整个架构更干净一些。
但是要回答你的问题:
您的所有单独项目不应直接相互通信。相反,真正的实现应该隐藏在 接口 后面。这意味着,view 对 presenter 一无所知(它甚至不知道 presenter class 存在),它只知道 接口 公开了 视图 需要的调用。
这样你就可以简单地为 ModelManager 和 presenter[=56] 之间的通信定义一个 interface =]:
interface ModelToPresenterInterface {
void returnData(Object data);
}
所有 演示者 都需要执行此操作(当然):
public myPresenter implements ModelToPresenterInterface {
void returnData(Object data){
// put your business logic here
}
}
这样,您只需将 接口 (您的每个 演示者 都已实现)传递给 模型管理器。这可能不会在构造函数中发生,因为每个 presenter.
只会使用一个管理器实例
static class ModelManager{
List<ModelToPresenterInterface> callbackList = new ArrayList<>();
void addListeningPresenter(ModelToPresenterInterface presenter){
callbackList.push(presenter);
}
public onReturnData(Object data){
for (int i = 0;i<callbackList.size();++i){
callbackList.get(i).returnData(object);
}
}
}
只要您确定总是只有一个 presenter 对您的数据感兴趣(这样就不会有 presenter 在堆栈的更下方)然后您也可以只使用一个变量,该变量会为每个新 presenter 覆盖。
还要非常小心,当演示者被销毁时,请务必将其从列表中删除!(否则会造成严重的内存泄漏)
再一次:我真的认为使用 EventBus 或类似的东西你会得到更好的结果,但这个版本应该也可以。希望我能提供帮助,如果您还有其他问题,请告诉我:)
经过一段时间开发个人 Android 应用程序后,我发现 Activity 通常会变得非常大,并且逻辑和 UI 操作混在一起。
所以寻找一种方法将逻辑与 UI 分开我遇到了 MVP 模式,现在我正试图在我要开发的应用程序中实现它。
所以基本上这就是我的方法:
我现在面临的问题是,为了将数据从模型返回给演示者,我会做这样的事情:
public static ModelManager (OnePresenter presenter)
{
localPresenter = presenter
}
然后:
public onReturnData(){
localPresenter.returnData();
}
问题是模型管理器可以随时从任何演示者调用,所以我如何传递通用演示者的引用?
非常感谢。
老实说,我认为您的方法不是处理此问题的最佳方法。实际上,您可以只使用 observer 模式 或 EventBus 来通知 presenters 何时收到数据.这样你就可以让你的 presenter 与 model 分开..这应该会让整个架构更干净一些。
但是要回答你的问题:
您的所有单独项目不应直接相互通信。相反,真正的实现应该隐藏在 接口 后面。这意味着,view 对 presenter 一无所知(它甚至不知道 presenter class 存在),它只知道 接口 公开了 视图 需要的调用。
这样你就可以简单地为 ModelManager 和 presenter[=56] 之间的通信定义一个 interface =]:
interface ModelToPresenterInterface {
void returnData(Object data);
}
所有 演示者 都需要执行此操作(当然):
public myPresenter implements ModelToPresenterInterface {
void returnData(Object data){
// put your business logic here
}
}
这样,您只需将 接口 (您的每个 演示者 都已实现)传递给 模型管理器。这可能不会在构造函数中发生,因为每个 presenter.
只会使用一个管理器实例static class ModelManager{
List<ModelToPresenterInterface> callbackList = new ArrayList<>();
void addListeningPresenter(ModelToPresenterInterface presenter){
callbackList.push(presenter);
}
public onReturnData(Object data){
for (int i = 0;i<callbackList.size();++i){
callbackList.get(i).returnData(object);
}
}
}
只要您确定总是只有一个 presenter 对您的数据感兴趣(这样就不会有 presenter 在堆栈的更下方)然后您也可以只使用一个变量,该变量会为每个新 presenter 覆盖。
还要非常小心,当演示者被销毁时,请务必将其从列表中删除!(否则会造成严重的内存泄漏)
再一次:我真的认为使用 EventBus 或类似的东西你会得到更好的结果,但这个版本应该也可以。希望我能提供帮助,如果您还有其他问题,请告诉我:)