soc*_*qwe 6 multithreading android threadpool intentservice
我有一个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");
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())
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
onHandleIntent()因为这个方法alread在IntentService工作线程上运行?如果是,是否存在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);
}
}
Run Code Online (Sandbox Code Playgroud)
Service如果你stopSelf用最新的(最高的)startId 打电话,A 将进入被毁状态.如果队列中有较新的启动,它将继续运行.
如果服务进入销毁状态,它将不会杀死您的线程池,因为它不知道它.问题是Android现在认为您的服务已经死亡,并且它不再被视为保持您的应用程序进程的理由.运行vs被破坏状态的服务本质上只是告诉Android有一些事情发生并且你不想被破坏的一种方式.
如果您想以正确的方式执行此操作,则必须使服务状态与实际运行状态保持同步.
IntentService是否是我想要实现的东西,我应该只是在onHandleIntent()中执行我的(长时间运行的)Runnable代码,因为这个方法alread在IntentService工作线程上运行?
如果您对单线程串行执行感到满意,是的.这onHandleIntent对你有什么用.
如果是,是否存在intent的队列限制,因为onHandleIntent()在完成和处理下一个Intent之前最多可以运行30秒.
没有限制(据我所知,这是一个链表).但是也没有什么可以阻止你产生比它能处理的更多的任务,这最终会导致某种溢出.
| 归档时间: |
|
| 查看次数: |
2145 次 |
| 最近记录: |