2012-03-31 36 views
0

我有這個線程。早些時候,我正在測試沒有線程的代碼,它工作正常。值被提取和處理。只要我把它放在線程中,Handler的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

處理程序中,他們正在創建的線程,在這種情況下是你的線程執行的Runnable,這樣就沒有意義了。此外,您在方法的範圍內創建了Handler,因此只要方法退出就可以進行垃圾回收。所以我不確定你是如何發送消息的,甚至不在可見範圍內。

您需要在您希望它處理Runnables(最可能是Main/UI線程)的線程上創建處理程序,並將對該處理程序的引用公開給您的服務。然後,您的服務將Runnables推送到處理程序,並將它們排隊並在主線程上執行。

+0

謝謝....我想知道它,但我期待一個異常(空指針或什麼)。 – kishu27 2012-03-31 08:18:25

相關問題