问题:我的ViewModel被破坏了,因为我必须在仍然需要它时启动另一个Activity。 (这不可避免地是一项新的(Android提供的)活动。)
背景:我有一个应用程序正在管理多个数据集之间的交互。它使用ViewModel作为性能缓存,因为数据访问速度可能很慢(可能需要10秒钟)。没有关键数据存储在ViewModel中,但是如果没有缓存,性能将是不可接受的。原始数据在文件系统上。
除非我积极测试并打开开发人员选项“不要保留活动”以模拟内存不足的方法,否则ViewModel的工作原理完全符合预期。从大量日志记录中,我非常确定发生了什么(详细信息如下)。我的问题是我是否想念我想到的替代品。
场景:
onCreate
完成,然后调用ViewModel的onCleared
。(此测试是在Oreo上进行的,但我怀疑这很重要。)
这是启动新“活动”的意图。显然,这是查找文件或目录的标准方法,并且工作正常(与
onActivityResult
)以获取新目录。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra("android.content.extra.SHOW_ADVANCED",true);
startActivityForResult(intent, REQUEST_DIR_LOOKUP);
我已经尝试了另一个Activity(称为B),我在其中拥有代码,该代码具有相同的问题,并且无法找到防止上述(4)中的ViewModel被清除的方法。在目录搜索(D)的情况下,甚至无法修改它。目录搜索意图开始之前必须是某种东西。
在我自己的活动(B)中,我尝试在ViewModel的isFinishing()
中使用onDestroy()
来跳过super.onDestroy
,结果不足为奇的是系统抛出了一个错误super.onDestroy()
没有被调用。我还尝试过让B的onCreate
从A获取ViewModel(成功地,它是相同的地址),但是A的onCleared
仍在B的onCreate
完成之后被调用(我希望能提供参考)计数器)。 (这已通过日志消息确认。)
在上述情况4中,当A被销毁时,我看不到防止ViewModel被销毁的方法。解决该问题将是理想的解决方案。将ViewModel转换为经典单例应该可以。除了对“不要进行活动”说“不这样做”之外,这是我最好的选择吗?
如果我确实选择单例,是否有比看到虚拟ViewModel的黑客更好的方法来查看onCleared
事件(当我确实要销毁ViewModel时)。 onDestroy
有点太早了,无法使用。
一个星期后
尽管有用,但这些注释并没有真正解决“固定”活动在ViewModel中不能很好地发挥作用的潜在问题。我希望我只是错过了一些东西,但是显然没有,我必须解决我认为是设计错误的问题。
我认为我在Pie上看到了一些细节上有所不同但相关的问题:“罐头”活动不支持当前轮换(与以前的所有版本一样)(是的,相同活动,如示例代码所示)。可以轻松地将其固定在“活动”中,但是需要对其进行修改,这是我试图避免的事情,尤其是对于该“活动”而言,因为它可能会逐个发布地更改。