繁体   English   中英

Android线程,服务及其之间的双向通信

[英]Android Threads, Services, and two way communication between them

我在努力思考这里需要发生的事情。 我目前正在运行可运行服务的应用程序。 该服务在启动时会打开在后台线程中运行的Web服务器。

在运行该服务的任何时候,用户都可以从浏览器向设备发送命令。 当前事件的顺序如下。

  1. 用户向服务器发送请求
  2. 服务器通过msg处理程序构造向服务发送消息,它发送数据,例如url参数
  3. 服务根据数据执行所需的操作,并希望在浏览器中向用户发送一些反馈消息
  4. ?????
  5. 服务器对请求的响应包含来自服务的反馈消息。

我的函数设置方式需要在等待服务响应时暂停我的serve()函数,然后在收到消息后恢复并发送http响应。

WebServer.java

public Response serve( String uri, String method, Properties header, Properties parms, Properties files )
{

    Bundle b = Utilities.convertToBundle(parms);
    Message msg = new Message();
    msg.setData(b);
    handler.sendMessage(msg);
    //sending a message to the handler in the service

    return new NanoHTTPD.Response();
}

CommandService.java

public class CommandService extends Service {

private WebServer webserver;
public Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
          execute_command(msg.getData());//some type of message should be sent back after this executes

      };

有什么建议么? 这种结构是解决该问题的最佳方法吗,还是您可以考虑一个更好的设计,从而实现更干净的实现?

我认为缺少答案的原因是,您对问题的含义尚未明确。 以我的经验,在StackOverflow上获得一般体系结构建议的简单或直接问题的答案比较容易。

我不是Android方面的专家,但我会试一试。 我的问题是为什么您要在服务的后台运行Web服务,为什么不只有一个类使您的服务成为Web服务呢?

关于线程,通信和睡眠,要记住的主要事情是,在服务当前请求的同时,Web服务器需要始终可用于服务新请求。 除此之外,客户端通常会等待线程完成其任务(即线程“阻塞”)。 因此,大多数Web服务器都会生成一个新线程来处理传入的每个请求。如果您有后台线程,但是在等待后台线程完成其任务的同时又阻塞了初始线程,那么除了完成所有任务之外,您的生活没有比这更好的了在一个线程上。 实际上,为了简单起见,后者将是优选的。

如果Android确实在收到请求时为您生成了新线程,则不需要后台线程。 只需在一个线程上同步完成所有操作,并以简单为乐!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM