IntentService和Threadpool

 AAAAaaaa叶子 发布于 2023-02-12 17:09

我有一个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 queue = 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秒.

没有限制(据我所知,这是一个链表).但是也没有什么可以阻止你产生比它能处理的更多的任务,这最终会导致某种溢出.

1 个回答
  • 在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秒.

    没有限制(据我所知,这是一个链表).但是也没有什么可以阻止你产生比它能处理的更多的任务,这最终会导致某种溢出.

    2023-02-12 17:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有