在主线程中运行的回调方法是否可以在onStartCommand的中间运行?

时间:2012-09-06 15:05:09

标签: android multithreading service

我知道onStartCommand中的代码将在主线程上运行。 在这个方法中,我产生了一个新的网络线程,它与服务器通信,当它完成时,它执行一个也在主线程中运行的回调方法。

我的问题是,如果两个方法onStartCommand和回调方法都在主线程中执行,并且只要网络调用完成就执行回调方法,那么回调方法的代码行是否可能在onStartCommand方法执行的中间?

这是如何运作的?

1 个答案:

答案 0 :(得分:1)

如果生成的网络线程进行了您确定将在主线程中执行的函数调用,那么实现此目的的唯一方法是通过某种共享资源,最常见的是:某种工作队列,a套接字,或两个线程之间共享的变量(通过方法调用设置),必须由主线程轮询,导致它执行某种方法。

我认为最简单的方法是工作队列,但根据您在评论中发布的链接,它提到了通常使用TCP / IP套接字的JSON。我将介绍每种方法的工作原理。

工作队列:

网络线程将创建某种工作条目并将其排入主线程工作队列。如果主线程位于方法(onStartCommand())的中间,那么它也不能执行工作条目。最有可能的是,当它完成当前方法时,它将返回并返回轮询方法,该方法将条目从队列中拉出。因此,如果使用此方法,则onSuccess()和onFailure()将创建并排入将从onStartCommand()返回后执行的工作条目

JSON套接字:

这种方法与工作队列非常相似,但不使用工作条目,而是使用套接字消息。并且将有一个函数将轮询(最有可能通过select()或poll())套接字并将接收的消息视为工作项。因此,如果使用此方法,则onSuccess()和onFailure()将创建并发送将在从onStartCommand()返回后执行的套接字消息