在低内存条件下保持AsyncTask存活?

时间:2010-08-22 13:56:10

标签: android memory android-widget android-asynctask

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

但是,在非常低的内存条件下,AsyncTask在完成生成位图之前很容易被操作系统杀死,导致主屏幕上出现空方块。因此,在创建AsyncTask之前,它会立即设置警报+ 5秒,并在图形完成后重置警报。这里的假设是,如果警报被触发,则该过程很可能被杀死,我们必须再设置另一个+ 5警报并重新开始。

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

我的问题是:这是最好的方法吗?有没有办法(礼貌地)要求OS不要杀死AsyncTask直到它完成(理由是杀死它实际上会导致更多浪费系统资源)?

据我所知,如果某个流程被归类为“可见”,那么除非作为最后的手段,否则Android不会将其删除。但我不知道如何将AsyncTask标记为“可见”。我很高兴在完成绘制小部件后立即杀死进程。只是希望它能活得足够长久才能完成。

3 个答案:

答案 0 :(得分:1)

通过绑定使用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

或者您可以使用IntentService作为@Mike建议;虽然我在文档中看不到“它获得与前台任务相同的杀戮优先级”。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此外,服务与Async相同。

完成工作后,请关闭服务。