Android MVP - потеря ссылки на представление в презентаторе "NullPointerException ... ссылка на нулевой объект" - PullRequest
0 голосов
/ 13 июня 2018

Я использую MVP в своем демонстрационном проекте, в моем View (фрагмент) у меня есть два editTexts (номер дела и имя пользователя) и кнопка.

При нажатии кнопки Я хочу вставить этот объект Case в базу данных.Итак, сначала проверьте, есть ли дело с тем же номером.И если это ложно, я собираюсь сохранить его в базе данных и уведомить пользователя, что дело сохранено в базе данных.В противном случае, просто отправив обратно сообщение, что операция не удалась и повторите попытку с другим номером.

Итак, объект проходит через слои, View> Presenter> Model> Repository.В репозитории проверка условий и отправка сообщения обратно для просмотра через те же слои, но наоборот (Репозиторий> Модель> Презентатор> Вид).

Я регистрирую все классы на наличие ошибок, и все в порядке.Но когда дело доходит до Presenter, я получаю "на нулевую ссылку на объект" для моего представления.

метод в моем Presenter, вызываемый из Model, где я получаю ошибку ...

public void sameCaseNumberMessage(String string){

    Log.d(TAG, "message from repository" + string);
    view.showToastMessage(string); //but here, view is  on a null object reference
}

На мой взгляд ...

@Inject
BottomFragmentContract.Presenter presenter;

...

@Override
public void onResume() {
    super.onResume();

    presenter.setView(this);
}

...

На моем докладчике ...

@Nullable
private BottomFragmentContract.View view;

...

@Override
public void setView(BottomFragmentContract.View view) {

    this.view = view;
    Log.d(TAG, "Hashcode is fine : " + this.view.toString());
}

...

1 Ответ

0 голосов
/ 07 июля 2018

Я предполагаю, что вы внедряете презентатора в вашу модель, и в этом случае проверьте, что это тот же экземпляр, что и тот, который поддерживается (и связан) вашим представлением.

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

Либо помечайте презентатора как одиночный, либо (лучше для тестирования) передайте модель в качестве параметра конструктора.

Я также хотел бы отметить, что, как правило, рекомендуется хранить сильные ссылки только в одном направлении. IE:

  • Просмотр (сильный) -> Ведущий (сильный) ->Модель (сильная) -> Репозиторий
  • Вид <- (слабый) Ведущий <- (слабый) Модель <- (слабый) Репозиторий </li>

.. т. .. сильная собственность, слабаяслушатели; -)

...