簡體   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