如何将数据返回到活动中,Android毁了什么

时间:2019-02-11 23:32:31

标签: android android-asynctask background-service

标题不好,请看下面以更好地了解我的问题

我有一个Android应用程序,其任务之一是耗时,通常需要2-5分钟才能完成...此任务是由后台服务完成的,该后台服务引用了启动者的活动。

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

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

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

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

如何避免这种情况?

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

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

ISN不需要耗费大量时间的后台服务,实际上之所以需要这么长时间,是因为它正在使用该服务验证某些用户的“凭证”(当我说一些凭证时,实际上不止一个)

所以我不能存储结果并相信它在下次运行时是有效的

我确实知道该协议需要改进,但是将需要进行较大的体系结构更改,所以我想知道是否有人对如何根据其实际要求进行处理

1 个答案:

答案 0 :(得分:2)

每次“活动”开始时是否需要运行后台任务?

通常,如果您的“活动”需要这些值才能起作用,并且计算或获取这些值花费的时间太长,那么您将在后台服务完成这些值之后存储这些值。

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

通常会有时间戳记何时将数据存储在缓存中,因此如果间隔太长,则可以:

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

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

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

由于不能保证该活动仍然存在,因此可以避免将服务的返回值返回给活动。取而代之的是,该服务仅通知Activity它将新更新的数据添加到存储位置,因此,如果Activity仍然存在,它将进行更新而不会出现问题。如果Activity已经被杀死,那么它将在再次启动时简单地获取数据。