Пока я пытаюсь справиться со смертью процесса в своем приложении для Android, я заметил, что ViewModel, которая была привязана к графу навигации, давала сбой при воссоздании после смерти процесса. Ниже приведен код ViewModel и фрагмента, который использует ViewModel.
@ExperimentalCoroutinesApi
@HiltViewModel
class ViewPrintOrderVM @Inject constructor(
private val repository: Repository,
private val application: Application,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
// Code inside the ViewModel
}
И в моем фрагменте я получаю ссылку следующим образом
@ExperimentalComposeUiApi
@ExperimentalCoroutinesApi
@AndroidEntryPoint
class ComposeFragmentPostPressDetails : Fragment() {
//Here we are scoping the ViewModel to the Navigation graph with graph-id instead of this fragment
private val viewModel: ManagePrintOrderVM by navGraphViewModels(R.id.print_order_flow)
//Rest of the Fragment code
}
Теперь, когда я пытаюсь проверить приложение на предмет смерти процесса, запустив приложение в эмуляторе, поместив его в фоновый режим, а затем уничтожив процесс с помощью кнопки «Завершить приложение» в студии Android, он вылетает при воссоздании со следующим ошибка
2022-03-19 19:06:44.633 7174-7174/com.sivakasi.papco.jobflow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sivakasi.papco.jobflow, PID: 7174
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sivakasi.papco.jobflow/com.sivakasi.papco.jobflow.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.getViewModel(FragmentPaperDetails.kt:42)
at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.observeViewModel(FragmentPaperDetails.kt:97)
at com.sivakasi.papco.jobflow.screens.manageprintorder.FragmentPaperDetails.onViewCreated(FragmentPaperDetails.kt:59)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1333)
at android.app.Activity.performStart(Activity.java:6992)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2780)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.InstantiationException: java.lang.Class<com.sivakasi.papco.jobflow.screens.manageprintorder.ManagePrintOrderVM> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
Тем не менее, все другие экраны, где ViewModel привязан только к этому фрагменту, а не к графу навигации, нормально работают при восстановлении процесса даже с внедрением зависимостей.
Что я делаю не так? Что мне делать, чтобы справиться со смертью процесса в потоке? Как справиться с воссозданием процесса во фрагментах, где ViewModel привязан к навигационному графу, а не к самому фрагменту или действию?
by navGraphViewModels
ничего не знает о вашей фабрике Hilt — она просто использует фабрику по умолчанию. Единственная причина, по которой это может работать в других случаях, заключается в том, что другой фрагмент, который делал использует фабрику Hilt, сначала создал ViewModel.
Согласно документация, вы должны использовать by hiltNavGraphViewModels()
, чтобы использовать внедренную Hilt ViewModel, привязанную к графу навигации.
// Add this to your dependencies
implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
// Then use it in place of navGraphViewModels()
private val viewModel: ManagePrintOrderVM by hiltNavGraphViewModels(R.id.print_order_flow)