Android MVP如何将数据从模型恢复到演示者

时间:2018-03-28 14:40:23

标签: android design-patterns model mvp presenter

经过一段时间开发个人Android应用程序后,我发现通常活动变得非常庞大,并且逻辑和UI操作都很混乱。

因此,寻找一种将逻辑与UI分离的方法我遇到了MVP模式,现在我正在尝试在我即将开发的应用程序中实现它。

所以基本上这就是我的方法:

enter image description here

我现在面临的问题是,为了将数据从模型传回给演示者,我会做这样的事情:

public static ModelManager (OnePresenter presenter)
{
    localPresenter = presenter
}

然后:

public onReturnData(){
    localPresenter.returnData();
}

问题是可以随时从任何演示者调用模型管理器,那么我如何传递Generic Presenter的引用呢?

非常感谢。

1 个答案:

答案 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 或类似的东西获得更好的结果,但这个版本也应该有效。希望我能提供帮助,如果您有其他问题,请告诉我们。)