我知道 onStartCommand 中的代码将在主线程上运行。在这个方法中,我生成了一个新的网络线程,它与服务器通信,当它完成时,它执行一个也在主线程中运行的回调方法。
我的问题是,如果onStartCommand和callback方法都在主线程中执行,并且只要网络调用完成就执行callback方法,那么callback方法的代码行是否可能在中间执行onStartCommand 方法的执行?
这是如何运作的?
我知道 onStartCommand 中的代码将在主线程上运行。在这个方法中,我生成了一个新的网络线程,它与服务器通信,当它完成时,它执行一个也在主线程中运行的回调方法。
我的问题是,如果onStartCommand和callback方法都在主线程中执行,并且只要网络调用完成就执行callback方法,那么callback方法的代码行是否可能在中间执行onStartCommand 方法的执行?
这是如何运作的?
如果生成的网络线程进行了您确定将在主线程中执行的函数调用,那么实现此目的的唯一方法是通过某种共享资源,最常见的是:某种工作队列、套接字或两个线程之间共享的变量(通过方法调用设置),必须由主线程轮询,导致它执行某个方法。
我认为最简单的方法是工作队列,但根据您在评论中发布的链接,它提到了通常使用 TCP/IP 套接字的 JSON。我将介绍每种方法通常是如何工作的。
工作队列:
网络线程将创建某种工作条目并将其排入主线程工作队列。如果主线程在方法(onStartCommand())的中间,那么它也不能执行工作条目。最有可能的是,当它完成当前方法时,它将返回并返回到从队列中拉出条目的轮询方法。因此,如果使用这种方法,那么 onSuccess() 和 onFailure() 将创建工作条目并将其排入队列,这些工作条目将从 onStartCommand() 返回后执行
JSON 套接字:
这种方法与工作队列非常相似,但将使用套接字消息而不是工作条目。并且将有一个函数会轮询(很可能通过 select() 或 poll())套接字并将接收到的消息视为工作项。因此如果使用这种方法,那么 onSuccess() 和 onFailure() 将创建并发送套接字消息,这些消息将在从 onStartCommand() 返回后执行