Обработка компонента кинжала при изменении ориентации

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

Каков чистый способ сохранить эту ссылку на компонент через жизненный цикл активности?

Пример. Вы реализуете шаблон MVP, поэтому вам нужен презентатор в вашей деятельности. Этот презентатор может выполнять сетевую операцию для загрузки элементов. Когда устройство вращается, ваша активность уничтожается и воссоздается, но вы хотите продолжать работу в сети и просто возвращать презентацию перед вращением.

Определение области компонентов, предоставляющей Presenter настраиваемой областью PerActivity, является решением, поэтому вам нужно сохранить экземпляр Component с помощью этого вращения, чтобы получить тот же экземпляр Presenter, что и первый запуск Activity.

Как мы можем справиться с этим? Я подумал о виде кэша компонентов (например, HashMap?), Который может быть предоставлен компонентом приложения, живущим внутри класса Application.

    Вы можете увидеть реализацию приложения для рисования / андроида . Решение, которое они выбрали, состоит в том, чтобы иметь в static Map<Long, ConfigPersistentComponent> , из которого распространяются все действия.

     public class BaseActivity extends AppCompatActivity { private static final AtomicLong NEXT_ID = new AtomicLong(0); private static final Map<Long, ConfigPersistentComponent> sComponentsMap = new HashMap<>(); private ActivityComponent mActivityComponent; private long mActivityId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the ActivityComponent and reuses cached ConfigPersistentComponent if this is // being called after a configuration change. mActivityId = savedInstanceState != null ? savedInstanceState.getLong(KEY_ACTIVITY_ID) : NEXT_ID.getAndIncrement(); ConfigPersistentComponent configPersistentComponent; if (!sComponentsMap.containsKey(mActivityId)) { // Creating new component configPersistentComponent = DaggerConfigPersistentComponent.builder() .applicationComponent(BoilerplateApplication.get(this).getComponent()) .build(); sComponentsMap.put(mActivityId, configPersistentComponent); } else { // Reusing component configPersistentComponent = sComponentsMap.get(mActivityId); } mActivityComponent = configPersistentComponent.activityComponent(new ActivityModule(this)); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(KEY_ACTIVITY_ID, mActivityId); } @Override protected void onDestroy() { if (!isChangingConfigurations()) { // Activity is finishing, removing the component sComponentsMap.remove(mActivityId); } super.onDestroy(); } ... } 

    Сеть может работать с контекстом приложения. Вот как я мог бы разработать Applicationcomponent с appscope. Теперь я бы создал это на уровне приложения ApplicationComponent Shouod, используя контекст как внешнюю зависимость

    Далее – активность компонента, распространяющаяся на активность модуля с коэффициентом активности .. в зависимости от приложения componet

    В каждом моем действии я бы создал activityComponet, предоставив ему applicationcomponet. К этому прикладному компоненту можно получить доступ через. Activity.getapplication (). Getapplicationcomponent ()

    Здесь убедитесь, что ваш прикладной модуль, предоставляющий сетевой метод, имеет appscope. Если это так, вы должны получить такую ​​же сеть даже в приложении rorate.

    Ищите образец GitHubapplication, разместите ссылку в следующем редактировании.

    Также ему стоит взглянуть на житияту (вне контекста для этого вопроса)