Почему моя ViewModel все еще жива после того, как я заменил текущий фрагмент в Android? - PullRequest
0 голосов
/ 16 февраля 2020

Пример. Если я заменил фрагмент «А» на «фрагмент В», «viewModelA» фрагмента А все еще активен. почему?

onCreate () фрагмента

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    viewModel = ViewModelProvider.NewInstanceFactory().create(InvoicesViewModel::class.java)
}

ViewModel

class InvoicesViewModel : ViewModel() {

init {
    getInvoices()
}

private fun getInvoices() {

    viewModelScope.launch {

        val response = safeApiCall() {
            // Call API here
        }

        while (true) {
            delay(1000)
            println("Still printing although the fragment of this viewModel destroied")
        }

        if (response is ResultWrapper.Success) {
            // Do work here
        }
    }
}
}

Этот метод используется для замены фрагмента

fun replaceFragment(activity: Context, fragment: Fragment, TAG: String) {
    val myContext = activity as AppCompatActivity
    val transaction = myContext.supportFragmentManager.beginTransaction()
    transaction.replace(R.id.content_frame, fragment, TAG)
    transaction.commitNow()
}

Вы заметите в то время как l oop внутри сопрограммы все еще работает, хотя после замены фрагмента на другой фрагмент.

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

это о вашей реализации ViewModelProvider. используйте этот способ для создания вашей viewModel.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProvider(this).get(InvoicesViewModel::class.java)
}

, таким образом вы дадите свой фрагмент в качестве живой области видимости модели.

0 голосов
/ 16 февраля 2020

Проверьте, создали ли вы ViewModel в Activity, передавая контекст действия или фрагмента.

...