Android MVP - Как правильно обрабатывать onActivityResult? - PullRequest
0 голосов
/ 07 января 2019

onActivityResult должно быть делегировано Presenter. Затем Presenter должен решить, что делать с результатом. Вопрос в том, как это сделать чистым способом?

В примерах Google есть пример приложения: https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksFragment.java#L115-L118

Делегирует результат в Presenter:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    mPresenter.result(requestCode, resultCode);
}

Но в этом решении есть ошибка . Presenter отбрасывает View (в данном случае Fragment) в методе onDestroy():

@Override
public void onDestroy() {
    super.onDestroy();
    mPresenter.dropView();  
}

И принимает View в onResume() метод:

@Override
public void onResume() {
    super.onResume();
    mPresenter.takeView(this);
}

Когда мы открываем новое действие для результата. Затем поверните телефон, затем завершите текущую активность и вернитесь к первому, у Presenter не будет View, потому что onActivityResult будет вызываться до onResume.

D/TasksFragment: onCreate
D/TasksFragment: onCreateView
D/TasksFragment: onStart
D/TasksFragment: onResume
--- open new activity for the result ---
D/TasksFragment: onPause
D/TasksFragment: onStop
--- rotate the phone ---
--- finish current activity ---
D/TasksFragment: onDestroy
D/TasksFragment: onCreate
D/TasksFragment: onCreateView
D/TasksFragment: onStart
D/TasksFragment: onActivityResult (called before onResume)
D/TasksFragment: onResume
...