【问题标题】:Android MVP How to get data back from model to presenterAndroid MVP 如何将数据从模型返回给演示者
【发布时间】:2018-03-28 14:40:22
【问题描述】:

在开发个人 Android 应用程序一段时间后,我发现活动通常会变得非常大,并且逻辑和 UI 操作非常混杂。

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

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

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

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

然后:

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

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

非常感谢。

【问题讨论】:

    标签: android design-patterns model mvp presenter


    【解决方案1】:

    说实话,我不认为您的方法是处理此问题的最佳方法。实际上,您可以只使用 观察者模式EventBus 在收到数据时通知 presenters。这样你就可以让你的 presentermodel 分离.. 这应该会使整个架构更干净一些。

    但要回答你的问题:

    所有单独的项目不应直接相互通信。相反,真正的实现应该隐藏在接口后面。这意味着,view 不知道关于 presenter 的任何事情(它甚至不知道存在 presenter 类),它只知道接口公开视图需要的调用。

    这样您就可以简单地为 ModelManagerpresenter 之间的通信定义一个接口

    interface ModelToPresenterInterface {
        void returnData(Object data);
    }
    

    您所有的演示者都需要实现这一点(当然):

    public myPresenter implements ModelToPresenterInterface {
        void returnData(Object data){
            // put your business logic here
        }
    }
    

    这样,您只需将接口(您的每个演示者都实现)传递给ModelManager。这可能不会发生在构造函数中,因为每个 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 对您的数据感兴趣(这样就没有 presenters 进一步向下堆栈)然后您也可以只使用一个变量,该变量会被每个新的 presenter 覆盖。

    还要非常小心,当演示者被破坏时,您确实要从列表中删除它!(否则会造成严重的内存泄漏)

    再说一次:我真的认为使用 EventBus 或类似的东西会得到更好的结果,但这个版本也应该可以工作。希望我能提供帮助,如果您还有其他问题,请告诉我:)

    【讨论】:

    • 感谢您提供非常有价值的回答。
    猜你喜欢
    • 2021-12-31
    • 2016-03-01
    • 1970-01-01
    • 2019-09-27
    • 2011-11-27
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多