简体   繁体   中英

Android Threads, Services, and two way communication between them

I'm struggling to wrap my head around what needs to happen here. I'm currently working on an app that runs a service. The service when started opens a webserver that runs in a background thread.

At any point while this service is running the user can send commands to the device from a browser. The current sequence of events is as follows.

  1. User sends request to server
  2. Server sends a message to the service via the msg handler construct, it sends data such as the url parameters
  3. The service does what it wants with the data, and wants to send some feedback message to the user in the browser
  4. ?????
  5. The server's response to the request contains a feed back message from the service.

The way my functions are set up I need to pause my serve() function while waiting for a response from the service and then once the message is received resume and send an http response.

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

      };

Any suggestions? Is this structure the best way to go about it, or can you think of a better design that would lead to a cleaner implementation?

I think the lack of answers is because you haven't been very specific in what your question is. In my experience it's easier to get answers to simple or direct questions that general architecture advice on StackOverflow.

I'm no expert on Android but I'll give it a shot. My question is why you have a Webservice running in the background of a Service, why not just have one class, make your Service the Webservice?

Regarding threading and communication and sleeping, the main thing to remember is that a webserver needs to always be available to serve new requests, whilst serving current requests. Other than that, it's normal that a client will wait for a thread to complete its task (ie the thread "blocks"). So most webservers spawn new a thread to handle each request that comes in. If you have a background thread but you block the initial thread while you wait for the background thread to complete its task, then you're no better off than just completing everything on the one thread. Actually, the latter would be preferable for the sake of simplicity.

If Android is actually spawning new threads for you when requests come in, then there's no need for a background thread. Just do everything synchronously on one thread and rejoice in the simplicity!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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