2012-03-31 11 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

ハンドラは、作成されたスレッド(この場合はスレッド)上でランナブルを実行するので意味がありません。また、メソッドのスコープ内でHandlerを作成したので、メソッドが終了するとすぐにガーベージ・コレクションを行うことができます。だから、たとえそれが目に見えない範囲にあっても、メッセージをどのように送信しているのか分かりません。

ランナブルを処理するスレッド(おそらくメインスレッド/ UIスレッド)にスレッドを作成し、そのハンドラへの参照をあなたのサービスに公開する必要があります。あなたのサービスはRunnablesをハンドラにプッシュし、キューに入れられてメインスレッド上で実行されます。

+0

ありがとう....私はそれについて疑問に思ったが、例外(NullPointerなど)を期待していた。 – kishu27