使用所需的Intent / Activity时的ViewModel生存期

时间:2019-05-23 01:59:27

标签: android android-intent android-activity android-viewmodel

问题:我的ViewModel被破坏了,因为我必须在仍然需要它时启动另一个Activity。 (这不可避免地是一项新的(Android提供的)活动。)

背景:我有一个应用程序正在管理多个数据集之间的交互。它使用ViewModel作为性能缓存,因为数据访问速度可能很慢(可能需要10秒钟)。没有关键数据存储在ViewModel中,但是如果没有缓存,性能将是不可接受的。原始数据在文件系统上。

除非我积极测试并打开开发人员选项“不要保留活动”以模拟内存不足的方法,否则ViewModel的工作原理完全符合预期。从大量日志记录中,我非常确定发生了什么(详细信息如下)。我的问题是我是否想念我想到的替代品。

场景:

  1. 应用程序启动并加载ViewModel并启动活动A。(准确地说是AppCompatActivity。)
  2. 用户进行交互,并决定更改包含某些(不是全部)缓存数据的目录。为此,需要启动内置的Android活动(D)“以获取结果”(以获取新的目录名称)。下面的代码。
  3. 如果未设置“不保留活动” :目录选择正常进行,并且ViewModel保留。 (等效地:该活动没有被破坏。)
  4. 如果设置了“不保留活动” (或者系统决定在用户​​查找新目录时终止活动):活动A在新活动( D)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上看到了一些细节上有所不同但相关的问题:“罐头”活动不支持当前轮换(与以前的所有版本一样)(是的,相同活动,如示例代码所示)。可以轻松地将其固定在“活动”中,但是需要对其进行修改,这是我试图避免的事情,尤其是对于该“活动”而言,因为它可能会逐个发布地更改。

0 个答案:

没有答案