为什么在 Android 中替换当前片段后我的 ViewModel 仍然存在?
Why my ViewModel is still alive after I replaced current fragment in Android?
例如,如果我将 'fragmentA' 替换为 'fragmentB',则片段 A 的 'viewModelA' 仍然存在。为什么?
片段的onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider.NewInstanceFactory().create(InvoicesViewModel::class.java)
}
视图模型
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()
}
您会注意到协程中的 while 循环仍然有效,尽管将片段替换为另一个片段后。
检查您是否在 Activity 中创建了传递 activity 或片段上下文的 ViewModel。
这是关于您对 ViewModelProvider
的实施。
使用这种方式创建您的 viewModel。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(InvoicesViewModel::class.java)
}
通过这种方式,您可以将片段作为视图模型的实时范围。
例如,如果我将 'fragmentA' 替换为 'fragmentB',则片段 A 的 'viewModelA' 仍然存在。为什么?
片段的onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider.NewInstanceFactory().create(InvoicesViewModel::class.java)
}
视图模型
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()
}
您会注意到协程中的 while 循环仍然有效,尽管将片段替换为另一个片段后。
检查您是否在 Activity 中创建了传递 activity 或片段上下文的 ViewModel。
这是关于您对 ViewModelProvider
的实施。
使用这种方式创建您的 viewModel。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(InvoicesViewModel::class.java)
}
通过这种方式,您可以将片段作为视图模型的实时范围。