2012-03-31 1 views
0

이 스레드가 있습니다. 이전에 스레드없이 코드를 테스트하고 있었는데 정상적으로 작동했습니다. 값을 가져 와서 처리했습니다. 이것을 스레드에 넣으면 처리기의 handleMessage 메소드가 호출되지 않습니다. 누군가 도와 주실 수 있습니까?스레드 내부에서 처리기의 동작이 다른가요?

public class ServiceQuery implements Runnable 
    { 
     public void run() 
     { 
      Looper.myLooper().prepare(); 
      while(true) 
      { 
       Log.d("D","Starting"); 
       fetch(); 
       try 
       { 
        Thread.sleep(5000); 
       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
     private synchronized void fetch() 
     { 
       Log.d("D","In fetch()"); 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("sessionid", Server.getInstance().getSessionID())); 
       nameValuePairs.add(new BasicNameValuePair("session", App.getInstance().getSelectedDoodle().getId())); 
       nameValuePairs.add(new BasicNameValuePair("passcode", App.getInstance().getSelectedDoodle().getPassword())); 
       nameValuePairs.add(new BasicNameValuePair("last-message-id", App.getInstance().lastDrawingID)); 

       Handler handler = new Handler() 
       { 
        public void handleMessage(Message message) 
        { 
         Log.d("D","got response"); 
         switch(message.what) 
         { 
          case HttpConnection.DID_SUCCEED: 
           Log.d("D","success" + message.obj.toString()); 
         } 
        } 
       } 
       Server.getInstance().SendHTTPRequest("get-messages", nameValuePairs, handler); 
       Log.d("D","HTTP away"); 

     } 
    } 

답변

3

핸들러는 작성한 스레드 (이 경우에는 스레드)에서 Runnables를 실행하므로 의미가 없습니다. 또한 메서드의 범위 내에서 Handler를 만들었으므로 메서드가 종료 되 자마자 가비지 수집 될 수 있습니다. 그래서 나는 그것이 보이지 않는 범위에서도 메시지를 어떻게 보내고 있는지 확신하지 못합니다.

Runnables (주로 Main/UI 스레드)를 처리하기를 원하는 스레드에 핸들러를 생성하고 해당 핸들러에 대한 참조를 서비스에 노출해야합니다. 그런 다음 서비스는 Runnables를 핸들러에 푸시 (push)하고 대기열에 올라서 메인 스레드에서 실행됩니다.

+0

감사합니다 .... 나는 그것에 대해 궁금해했지만 예외 (NullPointer 또는 뭔가)를 기대하고 있었다. – kishu27