android-onCleared未在Fragment附加的ViewModel上调用

前端之家收集整理的这篇文章主要介绍了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相关文章