我有一个IntentService,它应该像一个管理器,并在提交给ThreadPool的队列(Runnable)中创建任务.
我对IntentService的生命周期有点困惑:
该方法protected abstract void onHandleIntent (Intent intent)
已在分离的线程上运行.在onHandleIntent
我将创建一个新的Runnable实例并将其提交给ThreadPool.我的服务看起来像这样:
public class SyncService extends IntentService { private final ThreadPoolExecutor threadPool; public SyncService() { super("SyncService"); BlockingQueuequeue = new LinkedBlockingQueue (); 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()) } } }
我的问题:
在IntentService中使用ThreadPool是个好主意吗?
如果我使用ThreadPool,那么如果Threadpool没有更多Runnables要执行或排队,那么IntentService将被销毁,对吧?
IntentService是否已经是我想要实现的东西,我应该简单地执行我的(长时间运行的)Runnable代码,
onHandleIntent()
因为这个方法alread在IntentService工作线程上运行?如果是,是否存在intent的队列限制,因为onHandleIntent()在完成和处理下一个Intent之前最多可以运行30秒.
zapl.. 7
在IntentService中使用ThreadPool是个好主意吗?
并不是的.IntentService已经是您尝试实现的单线程(串行)变体.我会直接从中获得Service
.
如果我使用ThreadPool,那么如果Threadpool没有更多Runnables要执行或排队,那么IntentService将被销毁,对吧?
不会.一旦你返回,IntentService就可以进入被破坏的状态onHandleIntent
- 即,因为它threadPool.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); } }
Service
如果你stopSelf
用最新的(最高的)startId 打电话,A 将进入被毁状态.如果队列中有较新的启动,它将继续运行.
如果服务进入销毁状态,它将不会杀死您的线程池,因为它不知道它.问题是Android现在认为您的服务已经死亡,并且它不再被视为保持您的应用程序进程的理由.运行vs被破坏状态的服务本质上只是告诉Android有一些事情发生并且你不想被破坏的一种方式.
如果您想以正确的方式执行此操作,则必须使服务状态与实际运行状态保持同步.
IntentService是否是我想要实现的东西,我应该只是在onHandleIntent()中执行我的(长时间运行的)Runnable代码,因为这个方法alread在IntentService工作线程上运行?
如果您对单线程串行执行感到满意,是的.这onHandleIntent
对你有什么用.
如果是,是否存在intent的队列限制,因为onHandleIntent()在完成和处理下一个Intent之前最多可以运行30秒.
没有限制(据我所知,这是一个链表).但是也没有什么可以阻止你产生比它能处理的更多的任务,这最终会导致某种溢出.
在IntentService中使用ThreadPool是个好主意吗?
并不是的.IntentService已经是您尝试实现的单线程(串行)变体.我会直接从中获得Service
.
如果我使用ThreadPool,那么如果Threadpool没有更多Runnables要执行或排队,那么IntentService将被销毁,对吧?
不会.一旦你返回,IntentService就可以进入被破坏的状态onHandleIntent
- 即,因为它threadPool.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); } }
Service
如果你stopSelf
用最新的(最高的)startId 打电话,A 将进入被毁状态.如果队列中有较新的启动,它将继续运行.
如果服务进入销毁状态,它将不会杀死您的线程池,因为它不知道它.问题是Android现在认为您的服务已经死亡,并且它不再被视为保持您的应用程序进程的理由.运行vs被破坏状态的服务本质上只是告诉Android有一些事情发生并且你不想被破坏的一种方式.
如果您想以正确的方式执行此操作,则必须使服务状态与实际运行状态保持同步.
IntentService是否是我想要实现的东西,我应该只是在onHandleIntent()中执行我的(长时间运行的)Runnable代码,因为这个方法alread在IntentService工作线程上运行?
如果您对单线程串行执行感到满意,是的.这onHandleIntent
对你有什么用.
如果是,是否存在intent的队列限制,因为onHandleIntent()在完成和处理下一个Intent之前最多可以运行30秒.
没有限制(据我所知,这是一个链表).但是也没有什么可以阻止你产生比它能处理的更多的任务,这最终会导致某种溢出.