Android AsyncTask 同步
我有一个预定的服务(为了安排我使用了一组 BroadcastReceiver 和 AlarmManager)。服务使用 AsyncTask 执行一些长时间运行的操作。
- 连接到服务器
- 检查某些更新
- 加载更新(如果存在)
- 执行数据更新操作
我从 onStart 方法调用该任务,如下所示:
onStart(...){
...
new AsyncUpdate(...).execute(...);
}
用户可以手动执行更新操作(他按下运行服务的按钮)。 那么如果他在 AsyncUpdate 任务执行期间按下按钮怎么办?根据参考,将创建新的工作线程,因此我需要同步它们。 我使用我的服务类中的静态参数:
synchronized(MyService.runLock){//public static Object runLock = new Object();
...perform download and update operations
}
这是正确的吗?
我之前使用过 :remote 服务,因此该服务在单独的线程中执行,并且我不需要它们之间的同步,因为我知道我只有一个线程。
I have a scheduled Service (for scheduling I use a bundle of BroadcastReceiver and AlarmManager). Service does some long running operations using AsyncTask.
- Connect to the server
- Check for some updates
- Load updates if they exists
- Perform data update operations
I call the task from onStart method like this:
onStart(...){
...
new AsyncUpdate(...).execute(...);
}
User can perform update operations manually (he presses the button that runs the Service).
So what if he presses the button during executing of AsyncUpdate task? According to the reference new worker thread will be created so I need to synchronize them.
I use a static param from my Service class for it:
synchronized(MyService.runLock){//public static Object runLock = new Object();
...perform download and update operations
}
Is that correct?
I used :remote service before, so the Service executed in a separate thread and I didn't need synchronization between these because I knew I had just one thread.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 getStatus() 方法。
保留 AsyncUpdate 的引用并查看它是否返回 RUNNING。
You could use the getStatus() method.
Keep a reference of your
AsyncUpdate
and see if it returns RUNNING or not.如果您不介意操作排队,那么 IntentService 可能会对你有用。它处理自己的队列并在工作线程上依次执行每个请求。当它的工作用完时,它会自行停止。
If you don't mind the actions being queued then it's possible IntentService might be of use to you. It handles its own queue and executes each request in turn on a worker thread. When it runs out of work it will stop itself.