【问题标题】:How to return data to an Activity what was destroyed by Android如何将数据返回到被 Android 破坏的 Activity
【发布时间】:2019-07-05 13:05:17
【问题描述】:

标题不好,请阅读以下内容以更好地理解我的问题

我有一个 Android 应用程序,其中一项任务很耗时,通常需要 2 到 5 分钟才能完成...此任务由一个引用启动器活动的后台服务完成。

99% 的用户不想一直等待加载栏,而是简单地打开另一个应用程序或类似的东西......这可能导致 android destroying 引用的活动......

忽略这个故事的上下文泄漏......我的问题是:

当服务完成其任务时,它会尝试调用一个方法将值返回给父 Activity,但由于它现在被销毁了,所以我不能这样做......

因此,当用户重新打开应用程序时,该活动的最后一个已知状态是“正在加载”,因此它会永远加载......(或重试重新运行任务,这将导致另外 5 分钟的等待等等...... .)

我怎样才能避免这种情况?

==============更新==================

在得到一个很好的答案可能会解决像我这样的大多数问题后,我决定添加更多信息来解决我的问题。

耗时的后台服务不是处理密集型的,实际上需要这么长时间的原因是因为它正在使用服务验证一些用户“凭据”(当我说一些时,实际上不止一个)

所以我无法存储结果并相信它在下次运行时有效

我确实知道该协议需要改进,但会进行更大的架构更改,所以我想知道是否有人知道如何根据实际需求处理它

【问题讨论】:

    标签: android android-asynctask background-service


    【解决方案1】:

    是否需要在每次 Activity 启动时运行后台任务?

    通常,如果您的 Activity 需要这些值来工作,并且计算或获取这些值需要很长时间,您会在后台服务完成后存储这些值。

    基本上,您正在为数据创建缓存。因此,当您的 Activity 启动时,它会检查缓存中的数据。如果它找到数据,则立即加载它。如果它没有找到数据,那么它会运行后台任务(通常是初始运行)。

    数据存储在缓存中的时间戳也很常见,因此如果时间间隔太长,您可以:

    • 在运行后台任务时显示过时的数据。后台任务完成并将新数据存储到缓存中,然后通知 Activity 有新数据。使用新数据更新活动。

    • 不要显示过时的数据,而是清除旧数据的缓存并运行后台任务。

    基本上,此解决方案只是让您的服务将计算的值存储到存储位置,无论是数据库、SharedPreferences、文件等。

    您无需让服务返回值给 Activity,因为无法保证 Activity 仍然存在。相反,Service 只通知 Activity 它已将新更新的数据添加到存储位置,因此如果 Activity 仍然存在,它将毫无问题地更新。如果 Activity 已经被杀死,那么它会在再次启动时简单地获取数据。

    【讨论】:

    • 您的方法非常好,但可能不是我的答案...请阅读更新
    • 凭据验证绝对不能与我给出的答案一起使用。至少,不在客户端。如果它被反转并且您在服务器端使用了答案,您在其中缓存了验证结果,这会将时间缩短到几乎即时。服务器只需要快速检查用户的 ID 以查看它之前是否经过验证,而不是每次都进行验证。这样,对其有效性的信任是基于您自己的服务器而不是用户的设备。遗憾的是,由于不知道可以对服务器进行哪些更改,我不确定您是否可以进行此类更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多