经过一段时间开发个人Android应用程序后,我发现通常活动变得非常庞大,并且逻辑和UI操作都很混乱。
因此,寻找一种将逻辑与UI分离的方法我遇到了MVP模式,现在我正在尝试在我即将开发的应用程序中实现它。
所以基本上这就是我的方法:
我现在面临的问题是,为了将数据从模型传回给演示者,我会做这样的事情:
public static ModelManager (OnePresenter presenter)
{
localPresenter = presenter
}
然后:
public onReturnData(){
localPresenter.returnData();
}
问题是可以随时从任何演示者调用模型管理器,那么我如何传递Generic Presenter的引用呢?
非常感谢。
答案 0 :(得分:2)
说实话,我不认为你的方法是解决这个问题的最佳方法。您实际上只需使用观察者模式或 EventBus 即可在收到数据时通知演示者。通过这种方式,您可以将演示者与模型分开..这应该会使整个架构变得更加清晰。
但要回答你的问题:
所有单独的项目不应直接相互通信。相反,真正的实现应隐藏在接口后面。这意味着,视图对演示者一无所知(它甚至不知道演示者类存在),它只知道界面会公开视图所需的来电。
通过这种方式,您只需为 ModelManager 与演示者之间的通信定义界面:
interface ModelToPresenterInterface {
void returnData(Object data);
}
所有演示者都需要实现此目标(当然):
public myPresenter implements ModelToPresenterInterface {
void returnData(Object data){
// put your business logic here
}
}
有了这个,您只需将界面(每个演示者已实施)传递给 ModelManager 。这可能不会在构造函数中发生,因为每个演示者只会使用您的经理的一个实例。
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);
}
}
}
只要您确定始终只有一个演示者对您的数据感兴趣(以便在堆栈中没有演示者),那么您也可以使用为每个新的演示者覆盖的单个变量。
还要非常小心,当它被销毁时,你会从列表中删除演示者!(如果不是这会造成主要的内存泄漏)
再一次:我真的认为你会使用 EventBus 或类似的东西获得更好的结果,但这个版本也应该有效。希望我能提供帮助,如果您有其他问题,请告诉我们。)