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

相关问题