Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在内存不足的情况下使异步任务保持活动状态?_Android_Memory_Android Widget_Android Asynctask - Fatal编程技术网

Android 在内存不足的情况下使异步任务保持活动状态?

Android 在内存不足的情况下使异步任务保持活动状态?,android,memory,android-widget,android-asynctask,Android,Memory,Android Widget,Android Asynctask,我已经编写了一个主屏幕小部件作为ImageView,即代码生成整个小部件并将其作为位图写入RemoteView。在内存较低的较慢设备上,例如我的G1,生成位图可能需要几秒钟,为了避免可怕的强制关闭,我将所有图形代码移到了一个异步任务中。到目前为止还不错 但是,在内存非常低的情况下,操作系统很容易在完成位图生成之前终止AsyncTask,从而导致主屏幕上出现空方块。因此,在创建AsyncTask之前,它会将报警设置为+5秒,并在图形完成后重置报警。这里的假设是,如果警报被触发,进程很可能被终止,我

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

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

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

我的问题是:这是最好的方式吗?是否有某种方式(礼貌地)要求操作系统在异步任务完成之前不要终止它(理由是终止它实际上会导致更多的系统资源浪费)


我明白,如果一个进程被归类为“可见”,那么除了作为最后手段,Android不会杀死它。但我不知道如何将异步任务标记为“可见”。我很高兴这个过程在绘制完小部件后就被终止了。希望它能够保持足够长的生存时间以完成。

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

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

此外,服务的作用与异步相同


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

通过绑定到EmptyService并在工作完成后解除绑定,使用EmptyService,请参阅。我不确定这是否保证您的进程不会被杀死,或者是否只是减少了它被杀死的机会

您也可以使用前台服务,但必须为其提供状态栏通知,请参阅


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

我只是尝试了一下,然后花了几个小时玩不同的设置。我用START_STICKY、setForeground()和WAKE_锁进行了尝试。不幸的是,他们中没有一个人在内存不足的情况下保持代码的活动状态,也没有像我当前使用的报警代码那样轻松快速地恢复。我查看了一些Google的Android操作系统代码,我注意到当他们使用AsyncTask时,他们偶尔会从AsyncTask中启动一个空服务,根据评论,这是为了防止任务被终止。您可以在该文件第670行看到对它的引用: