Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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/9/silverlight/4.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_Thread Safety_Android Asynctask_Android Service_Android Lifecycle - Fatal编程技术网

Android 服务关闭时的操作顺序

Android 服务关闭时的操作顺序,android,thread-safety,android-asynctask,android-service,android-lifecycle,Android,Thread Safety,Android Asynctask,Android Service,Android Lifecycle,我正在编写一个使用AsyncTask执行一些网络操作的服务。假设AsyncTask的doInBackground花费了很长时间,在这种情况下,资源变少,操作系统正在关闭服务 异步任务何时终止?调用onDestroy时,AsyncTask是否仍在运行,还是在调用之后发生,还是我负责关闭AsyncTask?我正在尝试确保onDestroy中的代码与doInBackground中的代码之间没有竞争条件。AsyncTask将继续运行,直到您取消它或系统销毁承载它的进程。系统本身不知道您的AsyncTas

我正在编写一个使用AsyncTask执行一些网络操作的服务。假设AsyncTask的doInBackground花费了很长时间,在这种情况下,资源变少,操作系统正在关闭服务


异步任务何时终止?调用onDestroy时,AsyncTask是否仍在运行,还是在调用之后发生,还是我负责关闭AsyncTask?我正在尝试确保onDestroy中的代码与doInBackground中的代码之间没有竞争条件。

AsyncTask将继续运行,直到您取消它或系统销毁承载它的进程。系统本身不知道您的AsyncTask,因此在关闭服务时不会对它做任何事情,它当然不知道创建AsyncTask的服务

很可能在调用onDestroy之后,应用程序的进程也会被销毁,异步任务也会被销毁。但是,最安全的策略是主动并取消onDestroy中的AsyncTask


一个可能有趣的补充说明是,如果进程在处理之前就终止了,排队等待处理的请求将丢失。因此,发送到AsyncTask的任何必须完成的操作都需要写入持久性任务日志,以便在未完成时可以重新发布这些操作。

只是好奇,但为什么要在服务中使用AsyncTask?该服务与主应用程序在同一进程中运行,所以我相信在这种情况下,我需要使用异步任务,这样服务的网络访问就不会阻塞主ui线程。服务已经在自己的线程上运行。AsyncTasks用于活动服务尚未在其自己的线程上运行。来自android.app.Service文档:“服务不是一个线程。它本身不是一种脱离主线程工作的方法(以避免应用程序不响应错误)。”