我有一项活动,我使用asyctask的子类与后端服务器进行服务器同步。
鉴于这是一项网络任务,可能需要几秒钟。我担心会发生以下情况。
活动开始,每当asynctask开始运行时,它就会这样做。 onPrexecute()被调用,执行和结束。比doInBackground()被调用,并且这样做,但是,正好在执行该方法时,用户按下主页按钮并从最近的APPS中滑动应用程序。 (这个当然导致应用程序终止,所有的onDestroy方法都被调用了活着的活动..(纠正我,如果我错了))。
在我的onPostExecute()方法中,我将数据插入数据库并更新VIEW。 但是,由于应用程序被“终止”,onPostExecute()方法永远不会运行。
我的问题是:
答案 0 :(得分:3)
AsyncTask是一个后台任务,即使关闭应用程序并调用onDestroy()
,它也会继续运行。问题是当任务进入onPostExecute()
并尝试更新与其绑定的活动相关联的任何视图时,因为该活动不再存在。如果你担心这一点,我做的一件事就是在调用活动中保持对AsyncTask的引用,然后调用方法myAsyncTaskReference。cancel(true)
在onDestroy()
中取消它呼叫活动。
是的,我会将数据库操作放在doInBackground()
方法中,因为它在后台运行在一个单独的线程上,并且不需要引用应用程序活动。
您是否考虑过使用此类服务?我强烈推荐IntentService,它是服务的子类,专门用于在后台执行单个任务(类似于AsyncTask),然后在完成后自行终止。它很容易实现,通常只涉及覆盖一个方法 - onHandleIntent()
- 在服务启动时调用。
它可以处理所有数据库操作,并且它没有引用活动,因此您在#1中担心的问题永远不会发生。如果您需要更新视图,您可以让IntentService在完成后生成广播,并且您的活动可以注册该广播并在收到它时相应地更新它的视图。如果你的活动不再在广播发送之后,那么它就没关系,也没有什么会失败。
答案 1 :(得分:1)
查看此post,我已对其进行了测试。
答案 2 :(得分:1)
不,它不会停止。
将它放到某种类型的数据存储中然后再使用它会更好吗
为这些目标使用服务总是更好。 AsyncTasks不适合这里。请您的服务人员完成工作,然后您可以按照自己的意愿开始或退出活动。
答案 3 :(得分:1)
如果从最近的堆栈中滑动应用程序,它相当于关闭应用程序,因此它将终止与该进程相关的所有任务,因此异步任务也将被android系统杀死。 (甚至意图服务也被杀死)
它也取决于设备。制造商定制从最近的行为中删除应用程序