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

时间:2012-06-12 17:40:46

标签: java android multithreading android-service

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

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

  1. 用户向服务器发送请求
  2. 服务器通过msg处理程序构造向服务发送消息,它发送诸如url参数之类的数据
  3. 该服务按照数据执行所需操作,并希望在浏览器中向用户发送一些反馈消息
  4. ?????
  5. 服务器对请求的响应包含来自服务的反馈消息。
  6. 我的功能设置方式我需要暂停我的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
    
          };
    

    有什么建议吗?这种结构是最好的方法吗,或者你能想到一个更好的设计,以实现更清洁的实施吗?

1 个答案:

答案 0 :(得分:1)

我认为缺乏答案是因为你的问题并不是很具体。根据我的经验,可以更容易地获得有关StackOverflow上的一般架构建议的简单或直接问题的答案。

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

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

如果Android在请求进入时实际为您生成新线程,则不需要后台线程。只需在一个线程上同步执行所有操作,并以简单的方式欢欣鼓舞!