phansier/Clean-multimodel-arch

Проблема с инициализацией фичи после того как система убивает приложение

pavel163 opened this issue · 4 comments

Пробовал ваше решение и столкнулся с такой проблемой:

  1. открываю экран фичи
  2. сворачиваю приложение
  3. Система убивает процесс
  4. Открываю приложение и получаю креш, с текстом что компонент фичи не создан

На вашем примере это тоже воспроизводится. Вот стектрейс.
Process: com.example.eugene_matsyuk.dagger_arch, PID: 21048 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eugene_matsyuk.dagger_arch/com.example.antitheft_impl.presentation.view.AntitheftActivity}: java.lang.IllegalStateException: AntitheftFeatureComponent was not initialized! at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: java.lang.IllegalStateException: AntitheftFeatureComponent was not initialized! at com.example.antitheft_impl.di.AntitheftFeatureComponentHolder.getComponent$feature_antitheft_debug(AntitheftFeatureComponentHolder.kt:25) at com.example.antitheft_impl.presentation.view.AntitheftActivity.onCreate(AntitheftActivity.kt:23) at android.app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)  at android.os.Handler.dispatchMessage(Handler.java:107)  at android.os.Looper.loop(Looper.java:214)  at android.app.ActivityThread.main(ActivityThread.java:7356)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

Есть идеи по решению данной проблемы?
Мы в итоге пришли к своему решению

@pavel163 как вы в результате решили данную проблему у себя?

Идея такая что, если нет компоненты фичи FeatureComponet, то идем и ищем для нее фабрику. Эта фабрика может в виде зависимости принимать другую компоненту например SomeComponent. Поэтому при создание фабрики для FeatureComponet мы проверяем также, есть ли эта SomeComponent, если ее нет идем и достаем для нее фабрику. Ну а если SomeComponent зависит от SingletonComponent, то фабрика для нее будет, так SingletonComponent создается на старте Application.

Фабрики и компоненты можно хранить в синглетоне в Map<Class, Component>

Тоже столкнулся с этой проблемой, когда стал применять этот подход у себя. Что-то пока не могу придумать как его красиво решить, @pavel163 может поделитесь более детально своим подходом?
@phansier можете также что-то посоветовать по поводу этой проблемы?

@pavel163 @nestoleh @phansier Решили ли как-то данную проблему ?