Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android IntentService和线程池_Android_Multithreading_Threadpool_Intentservice - Fatal编程技术网

Android 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 {

我有一个IntentService,它应该像一个管理器一样,在队列(可运行)中创建任务,并提交给线程池

我对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())
}
}
}
我的问题是:

  • 在IntentService中使用线程池是个好主意吗
  • 如果我使用线程池,那么如果线程池没有更多的可运行程序可执行或排队,那么IntentService将被销毁,对吗
  • IntentService已经是我想要实现的东西了吗?我应该在
    onHandleIntent()
    ,因为此方法在 IntentService工作线程?如果是,是否有排队限制 意图,因为onHandleIntent()可以在 完成和处理下一个意图
  • 在IntentService中使用线程池是个好主意吗

    不是真的。IntentService已经是您尝试实现的单线程(串行)变体。我将直接从
    服务
    派生

    如果我使用线程池,那么如果线程池没有更多的可运行程序可执行或排队,那么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没有内置的方法来取消任务,一旦任务进入队列,它们将被处理。如果需要,您需要添加它。可以使用Yes
    Context
    启动自身。指数重试应该在这两方面都很好。如果你说的是一秒钟左右的睡眠,我会简单地使用睡眠。如果有任何报警管理器或第三个选项,则较长的时间将阻止其他任务:获取
    IntentService
    的源代码,并使用
    sendMessageDelayed
    与该
    处理程序一起添加延迟启动方式。