Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android-onCleared未在Fragment附加的ViewModel上调用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当应用程序进入后台时没有调用viewmodel.onCleared()时,我偶然发现了一个问题(即使没有启用活动),但我可以看到实际上正在调用Fragment.onDestroy().

以下代码可能有什么问题?如何在此场景中实际调用viewmodel.onCleared()?

视图模型:

class viewmodelFirst(application: Application) : Androidviewmodel(application) {

    companion object {
        private const val TAG = "viewmodelFirst"
    }

    init {
        Log.v(tag,"Created")
    }

    override fun onCleared() {
        super.onCleared()
        Log.v(tag,"onCleared")
    }
}

分段:

class FragmentFirst : Fragment() {

    companion object {
        private const val TAG = "FragmentFirst"
    }

    override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {

        viewmodelProviders.of(this).get(viewmodelFirst::class.java)

        return inflater.inflate(R.layout.fragment_first,container,falsE)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.v(tag,"onDestroy")
    }
}

活动:

class MainActivity : AppCompatActivity() {

    companion object {
        private const val TAG = "MainActivity"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceStatE)
        setContentView(R.layout.activity_main)
        if (savedInstanceState == null) {
            supportFragmentManager.begintransaction().replace(R.id.container,FragmentFirst()).commit()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.v(tag,"onDestroy")
    }    
}

自己回答:

这是com.android.support:appcompat-v7:27.1.0的错误

如果我使用以下依赖项,我遇到此问题:

implementation 'com.android.support:appcompat-v7:27.1.0'
implementation "android.arch.lifecycle:extensions:1.1.0"

如果我更改appcompat-v7 27.1.0的版本 – > 27.0.2,然后viewmodel.onCleared()按预期工作(当应用程序转到后台我有调用).

appcompat-v7:28.0.0-alpha1也可以,看起来这只是appcompat-v7的一个问题:27.1.0

更新(2018年6月)

正如@Akshay所说,这个错误在27.1.1有点固定.但不完全不幸.

以下方案仍未修复:

>不要保持活动.
>启动应用程序.
>按下主页按钮.

在27.0.2我在logcat上有以下输出

V/viewmodelFirst: Created
V/viewmodelFirst: onCleared
V/FragmentFirst: onDestroy
V/MainActivity: onDestroy

哪个完全正确.

但是在27.1.1到28.0.0-alpha3我在logcat有以下输出

V/viewmodelFirst: Created
V/FragmentFirst: onDestroy
V/MainActivity: onDestroy

我们可以看到活动和片段被破坏但是viewmodel没有被onCleared通知.

我怀疑,如果不停止活动将被禁用,并且Android会自然卸载应用程序(由于另一个应用程序要求提供一堆资源)某个时刻,viewmodel.onCleared()将不会被称为非常悲伤.

附:我在这里推了代码https://github.com/allco/onClearedInvestigation

并在此向Google报告此问题:https://issuetracker.google.com/issues/110285295

更新(2018年8月)

28.0.0-rc01解决了这个问题.好极了!

解决方法

这是Support Library v27.1.0中的一个问题,已在Support Library v27.1.1中修复.

之前在https://issuetracker.google.com/issues/74139250报告了一个错误.

有关详细信息,请参阅此链接https://developer.android.com/topic/libraries/support-library/revisions

大佬总结

以上是大佬教程为你收集整理的android-onCleared未在Fragment附加的ViewModel上调用全部内容,希望文章能够帮你解决android-onCleared未在Fragment附加的ViewModel上调用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。