2012-06-12 6 views
1

나는 여기서 일어날 일에 대해 머리 글자를 쓰려고 고심하고있다. 저는 현재 서비스를 실행하는 앱을 만들고 있습니다. 시작될 때 서비스는 백그라운드 스레드에서 실행되는 웹 서버를 엽니 다.안드로이드 쓰레드, 서비스, 그들 사이의 양방향 통신

언제든지이 서비스가 실행되는 동안 사용자는 브라우저에서 장치로 명령을 보낼 수 있습니다. 현재 이벤트 순서는 다음과 같습니다.

  1. 사용자가 서버가 MSG 핸들러 구조를 통해 서비스에 메시지를 전송
  2. 서버로 요청을 전송, 이러한 서비스는 데이터로 원하는 것을 수행하는 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 

     }; 

어떤 제안? 이 구조가 가장 좋은 방법일까요? 아니면 더 깨끗한 구현으로 이어질 수있는 더 나은 디자인을 생각할 수 있습니까?

+0

이 백그라운드 서비스에서 웹 서비스와 통신하고 있습니까? – anargund

+0

webservice는 장치에서 실행되는 경량 웹 서버입니다. 서버는 CommandService에 의해 시작됩니다. 서버 역할은 장치와 사용자 (브라우저) 사이의 통신자가됩니다. CommandService는 모든 장치 특정 논리를 처리합니다. 그래서 귀하의 질문에 대답하기 위해 백그라운드 서비스에서 백그라운드 스레드에서 실행중인 웹 서버가 생성 및 소유하는 웹 서버와 통신합니다. – Mike

+0

서비스와 전경 활동 사이에 어떤 의사 소통이 있어야합니까? –

답변

1

나는 당신이 당신의 질문에 구체적이지 않았기 때문에 대답이 부족하다고 생각합니다. 내 경험상 StackOverflow에 대한 일반적인 아키텍처 조언과 관련하여 간단하거나 직접적인 질문에 대한 답변을 얻는 것이 더 쉽습니다.

저는 Android에 대해 전문가가 아니지만 한 번만 알려 드리겠습니다. 내 질문에 왜 당신은 서비스의 배경에서 실행중인 Webservice를 가지고, 왜 그냥 하나의 클래스가 귀하의 서비스를 Webservice하지?

스레딩 및 통신 및 휴면과 관련하여 기억해야 할 주요 사항은 현재 요청을 처리하는 동안 웹 서버가 항상 새로운 요청을 처리 할 수 ​​있어야한다는 것입니다. 그 외에는 클라이언트가 스레드가 작업 (즉, 스레드 "블록")을 완료 할 때까지 기다리는 것이 정상입니다. 따라서 대부분의 웹 서버는 들어오는 각 요청을 처리 할 수있는 새로운 스레드를 생성합니다. 백그라운드 스레드는 있지만 백그라운드 스레드가 해당 작업을 완료하기를 기다리는 동안 초기 스레드를 차단하면 모든 것을 완료하는 것보다 나을 수 있습니다 한 스레드에서. 실제로, 후자는 단순성을 위해 바람직 할 것이다.

요청이 들어올 때 안드로이드가 실제로 새로운 스레드를 생성하면 배경 스레드가 필요 없습니다. 하나의 스레드에서 모든 것을 동 기적으로 수행하고 단순함을 기뻐하십시오!