3

我已经将主屏幕小部件编写为 ImageView,即。该代码生成整个小部件并将其作为位图写入 RemoteViews。在内存较低的较慢设备上,例如我的 G1,生成位图可能需要几秒钟,为了避免可怕的强制关闭,我将所有图形代码移到 AsyncTask 中。到目前为止,一切都很好。

但是,在内存非常低的情况下,AsyncTask 很容易在它完成生成位图之前被操作系统杀死,从而导致主屏幕上出现一个空白方块。所以在创建 AsyncTask 之前,它设置了 now + 5 秒的警报,并且在图形完成后,它会重置警报。这里的假设是,如果触发警报,则很可能进程被杀死,我们必须设置另一个 now+5 警报并重新开始。

这确实有效,但在内存极低的情况下,绘制小部件可能需要多次尝试(20 多秒),所以我添加了一个占位符沙漏图像,作为静态资源,它显示在主屏幕上,直到真实图像准备好.

我的问题是:这是最好的方法吗?有没有办法(礼貌地)要求操作系统在 AsyncTask 完成之前不要杀死它(因为杀死它实际上会导致更多的系统资源浪费)?

我知道如果一个进程被归类为“可见”,那么 Android 不会杀死它,除非作为最后的手段。但我不知道如何将 AsyncTask 标记为“可见”。我很高兴该过程在绘制小部件后立即被终止。只是希望它能够存活足够长的时间来完成。

4

3 回答 3

1

通过绑定到 EmptyService 并在工作完成后解除绑定来使用 EmptyService,请参阅https://github.com/android/platform_packages_providers_calendarprovider/blob/master/src/com/android/providers/calendar/EmptyService.java。我不确定这是否能保证你的进程不会被杀死,或者只是减少它被杀死的机会。

您也可以使用前台服务,但您必须为其提供状态栏通知,请参阅http://developer.android.com/guide/components/services.html#Foreground

或者您可以按照@Mike 的建议使用 IntentService;尽管我在文档中看不到“它与前台任务获得相同的终止优先级”。

于 2014-02-13T16:36:36.200 回答
0

尝试使用服务类,您可以将服务设置为“前台”。关闭前台服务的可能性几乎为零。

此外,Service 的作用与 Async 相同。

完成工作后,立即关闭服务。

于 2013-07-22T09:47:36.147 回答
0

您是否考虑过为此使用 IntentService?当您的服务代码正在执行时,它会获得与前台任务相同的终止优先级。它不会像 AsyncTask 那样与小部件紧密耦合,但我认为它会增加代码完成的几率。

于 2010-09-04T20:45:58.837 回答