Android IntentService和线程池
我有一个IntentService,它应该像一个管理器一样,在队列(可运行)中创建任务,并提交给线程池 我对IntentService的生命周期有点困惑: 方法Android IntentService和线程池,android,multithreading,threadpool,intentservice,Android,Multithreading,Threadpool,Intentservice,我有一个IntentService,它应该像一个管理器一样,在队列(可运行)中创建任务,并提交给线程池 我对IntentService的生命周期有点困惑: 方法protected abstract void onHandleIntent(Intent-Intent)已经在一个单独的线程上运行。在onHandleIntent中,我将创建一个新的可运行实例,并将其提交到线程池。我的服务如下所示: public class SyncService extends IntentService {
protected abstract void onHandleIntent(Intent-Intent)
已经在一个单独的线程上运行。在onHandleIntent
中,我将创建一个新的可运行实例,并将其提交到线程池。我的服务如下所示:
public class SyncService extends IntentService {
private final ThreadPoolExecutor threadPool;
public SyncService() {
super("SyncService");
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
threadPool = new ThreadPoolExecutor(1, 1, 20, TimeUnit.SECONDS, queue);
}
@Override
public void onCreate() {
super.onCreate();
EventBus.getInstance().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getInstance().unregister(this);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent.getAction().equals("sync")){
threadPool.submit(new SyncRunnable());
}else
if(intent.getAction().equals("delete")){
threadPool.submit(new DeleteRunnable());
} else
if(intent.getAction().equals("register")){
threadPool.submit(new RegisterRunnable())
}
}
}
公共类SyncService扩展了IntentService{
私有最终线程池执行器线程池;
公共服务(){
超级(“同步服务”);
BlockingQueue=新建LinkedBlockingQueue();
threadPool=新的ThreadPoolExecutor(1,1,20,TimeUnit.SECONDS,队列);
}
@凌驾
public void onCreate(){
super.onCreate();
EventBus.getInstance().register(此);
}
@凌驾
公共空间{
super.ondestory();
EventBus.getInstance().unregister(此);
}
@凌驾
受保护的手部内容无效(意图){
if(intent.getAction().equals(“sync”)){
submit(新的SyncRunnable());
}否则
if(intent.getAction()等于(“删除”)){
提交(新的DeleteRunnable());
}否则
if(intent.getAction().equals(“寄存器”)){
threadPool.submit(新的RegisterRunnable())
}
}
}
我的问题是:
onHandleIntent()
,因为此方法在
IntentService工作线程?如果是,是否有排队限制
意图,因为onHandleIntent()可以在
完成和处理下一个意图服务
派生
如果我使用线程池,那么如果线程池没有更多的可运行程序可执行或排队,那么IntentService将被销毁,对吗
不可以。一旦您从OnHandleContent
返回,IntentService可能会进入已销毁状态,即立即进入,因为线程池。submit
是非阻塞的。在服务中,它调用stopSelf(int)
,使用服务启动时获得的startId
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
如果您使用最新(最高)startId调用stopSelf
,则服务将进入销毁状态。如果队列中有新的开始,它将继续运行
如果服务进入销毁状态,它将不会杀死您的线程池,因为它对此一无所知。问题是Android现在认为你的服务已经死了,它不再是你继续应用程序进程的理由。运行vs destrocted state的服务本质上只是一种告诉Android有事情发生,你不想被破坏的方式
如果您想以正确的方式执行此操作,则必须使服务状态与实际发生的情况保持同步
IntentService已经是我想要实现的东西了吗?我是否应该在onHandleIntent()中执行我的(长时间运行的)可运行代码,因为该方法在IntentService工作线程上运行
如果您对单线程串行执行感到满意,可以。这就是OnHandleContent
为您所做的
如果是,intent是否有队列限制,因为onHandleIntent()在完成和处理下一个intent之前可能会运行30秒
没有限制(据我所知,这是一个链表)。但是,也没有什么能阻止您产生超出其处理能力的任务,这最终会导致某种溢出。谢谢!您已经证实了我的怀疑,即IntentService已经是我正在寻找的(运行命令的单线程队列)。IntentService是一个单例服务,只有在处理了最后一个等待意图后才会被销毁,对吗?IntentService是否可以取消所有等待的Intent?既然IntentService有一个上下文,我可以自己启动吗?如果发生错误,我希望在等待一段时间后重试(这段时间将随着失败次数呈指数增长)。我看到了两种可能性:在onHandleIntent()线程.sleep()中使用或使用AlarmManager。有什么建议吗?singleton是的,只有当所有任务都完成(Android仍然可以杀死你的整个进程)时才会被销毁,任务是严格按照顺序处理的,所以最新的任务是在销毁之前需要完成的任务。IntentService没有内置的方法来取消任务,一旦任务进入队列,它们将被处理。如果需要,您需要添加它。可以使用YesContext
启动自身。指数重试应该在这两方面都很好。如果你说的是一秒钟左右的睡眠,我会简单地使用睡眠。如果有任何报警管理器或第三个选项,则较长的时间将阻止其他任务:获取IntentService
的源代码,并使用sendMessageDelayed
与该处理程序一起添加延迟启动方式。