1

我正在努力解决这里需要发生的事情。我目前正在开发一个运行服务的应用程序。该服务在启动时会打开一个在后台线程中运行的网络服务器。

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

  1. 用户向服务器发送请求
  2. 服务器通过 msg 处理程序构造向服务发送消息,它发送诸如 url 参数之类的数据
  3. 服务对数据做它想做的事,并希望在浏览器中向用户发送一些反馈消息
  4. ???
  5. 服务器对请求的响应包含来自服务的反馈消息。

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

网络服务器.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();
}

命令服务.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

      };

有什么建议么?这种结构是实现它的最佳方式,还是你能想到一个更好的设计来实现更清晰的实现?

4

1 回答 1

1

我认为缺乏答案是因为您没有非常具体地说明您的问题是什么。根据我的经验,在 StackOverflow 上获得一般架构建议的简单或直接问题的答案更容易。

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

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

如果 Android 在请求进来时实际上为您生成了新线程,那么就不需要后台线程。只需在一个线程上同步执行所有操作,并为简单而欢欣鼓舞!

于 2012-07-10T09:29:06.880 回答