Java Android线程、服务以及它们之间的双向通信

Java Android线程、服务以及它们之间的双向通信,java,android,multithreading,android-service,Java,Android,Multithreading,Android Service,我正在努力思考这里需要发生什么。我目前正在开发一个运行服务的应用程序。服务启动时会打开在后台线程中运行的Web服务器 在运行此服务的任何时候,用户都可以从浏览器向设备发送命令。目前的事件顺序如下 用户向服务器发送请求 服务器通过msg处理程序构造向服务发送消息,它发送url参数等数据 该服务对数据执行它想要的操作,并希望在浏览器中向用户发送一些反馈消息 "" 服务器对请求的响应包含来自服务的反馈消息 按照设置函数的方式,我需要在等待服务响应时暂停我的service()函数,然后在收到消息后恢复并

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

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

  • 用户向服务器发送请求
  • 服务器通过msg处理程序构造向服务发送消息,它发送url参数等数据
  • 该服务对数据执行它想要的操作,并希望在浏览器中向用户发送一些反馈消息
  • ""
  • 服务器对请求的响应包含来自服务的反馈消息
  • 按照设置函数的方式,我需要在等待服务响应时暂停我的service()函数,然后在收到消息后恢复并发送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
    
          };
    

    有什么建议吗?这种结构是最好的解决方法吗?或者你能想出一种更好的设计来实现更干净的实现吗?

    我认为缺乏答案是因为你没有非常具体地回答你的问题。根据我的经验,对于一般架构建议的简单或直接的问题,要得到答案要容易得多

    我不是安卓方面的专家,但我会尝试一下。我的问题是,为什么要在服务的后台运行Web服务,为什么不只使用一个类,让您的服务成为Web服务

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


    如果Android真的在收到请求时为您生成新线程,那么就不需要后台线程。只要在一个线程上同步完成所有事情,就可以享受简单

    我认为缺乏答案是因为你没有非常具体地回答你的问题。根据我的经验,对于一般架构建议的简单或直接的问题,要得到答案要容易得多

    我不是安卓方面的专家,但我会尝试一下。我的问题是,为什么要在服务的后台运行Web服务,为什么不只使用一个类,让您的服务成为Web服务

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


    如果Android真的在收到请求时为您生成新线程,那么就不需要后台线程。只要在一个线程上同步完成所有事情,就可以享受简单

    因此,通过这个后台服务,您正在与一个Web服务通信?该Web服务是一个在设备上运行的轻量级Web服务器。服务器由CommandService启动。服务器角色是设备和用户(浏览器)之间的通讯器。CommandService处理所有特定于设备的逻辑。因此,为了回答您的问题,我的后台服务正在与它创建并拥有的Web服务器(类成员)通信这是在后台线程中运行的。如果服务和前台活动之间应该有任何通信,该怎么办?启动活动只是为服务主持一个切换,最终将有一些设置。一旦启动,我就可以通过网络界面告诉设备做一些事情,比如启动www.google.com浏览器。但这项服务正在启动中。该服务是一个foregroundService,因此有一个运行该服务的通知。因此,从该后台服务,您正在与一个Web服务通信?该Web服务是一个在设备上运行的轻型Web服务器。服务器由CommandService启动。服务器角色是设备和用户(浏览器)之间的通讯器。CommandService处理所有特定于设备的逻辑。因此,为了回答您的问题,我的后台服务正在与它创建并拥有的Web服务器(类成员)通信这是在后台线程中运行的。如果服务和前台活动之间应该有任何通信,该怎么办?启动活动只是为服务主持一个切换,最终将有一些设置。一旦启动,我就可以通过网络界面告诉设备做一些事情,比如启动www.google.com浏览器。但这项服务正在启动中。该服务是一个foregroundService,因此有一个正在运行的通知。