以下代码可能有什么问题?如何在此场景中实际调用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解决了这个问题.好极了!
解决方法
之前在https://issuetracker.google.com/issues/74139250报告了一个错误.
有关详细信息,请参阅此链接:https://developer.android.com/topic/libraries/support-library/revisions