Android MVP Как вернуть данные от модели к ведущему

Через некоторое время, разрабатывая персональные приложения для Android, я обнаружил, что обычно действия становятся очень большими и имеют как логические операции, так и операции пользовательского интерфейса.

Итак, в поисках способа отделить логику от пользовательского интерфейса я наткнулся на шаблон MVP и теперь пытаюсь реализовать его в приложении, которое собираюсь разработать.

Так что в основном это был бы мой подход:

введите здесь описание изображения

Проблема, с которой я столкнулся сейчас, заключается в том, что для возврата данных от модели к ведущему я бы сделал что-то вроде этого:

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

А потом:

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

Проблема в том, что Model Manager может быть вызван из любого презентатора в любое время, так как я могу передать ссылку на Generic Presenter?

Большое спасибо.


person Aldridge1991    schedule 28.03.2018    source источник


Ответы (1)


Честно говоря, я не думаю, что ваш подход - лучший способ справиться с этим. На самом деле вы можете просто использовать шаблон наблюдателя или 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 или что-то подобное, но эта версия также должна работать. Надеюсь, я смог помочь и дайте мне знать, если у вас есть дополнительные вопросы :)

person Bmuig    schedule 29.03.2018
comment
Спасибо за действительно ценный ответ. - person Aldridge1991; 29.03.2018