2012-03-31 6 views
0

Ich habe dieses Thema. Früher habe ich den Code ohne den Thread getestet und es hat gut funktioniert. Werte wurden abgerufen und verarbeitet. Sobald ich dies in den Thread eingefügt habe, wird die HandleMessage-Methode von Handler nicht aufgerufen. Kann mir bitte jemand helfen?Ist das Verhalten eines Handler innerhalb Thread anders?

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"); 

     } 
    } 

Antwort

3

Handlers ausführen Runnables im Thread sie erstellt werden, die in diesem Fall der Thread ist, so dass macht keinen Sinn. Außerdem haben Sie Ihren Handler im Rahmen einer Methode erstellt. Daher kann Garbage Collector gesammelt werden, sobald die Methode beendet wird. Ich bin mir also nicht sicher, wie Sie eine Nachricht senden, wenn sie nicht einmal im sichtbaren Bereich ist.

Sie müssen den Handler in dem Thread erstellen, in dem die Runnables verarbeitet werden sollen (höchstwahrscheinlich der Main/UI-Thread) und einen Verweis auf diesen Handler für Ihren Service verfügbar machen. Ihr Dienst sendet dann Runnables an den Handler und diese werden in die Warteschlange gestellt und im Hauptthread ausgeführt.

+0

danke .... Ich habe mich gefragt, aber ich habe eine Ausnahme erwartet (NullPointer oder so). – kishu27