2017-12-21 1 views
1

Ich habe versucht, den Looper und Handler in Android zu verstehen, aber stecken geblieben mit dem Beispiel geschrieben. Was ich versuche zu tun ist, fügen Sie einen Looper zum Thread, um Thread kontinuierlich in run() -Methode zu machen. Schreiben Sie dann Nachrichten oder Runnables an den Hanl-Thread.Looper Handler Beispiel

public class HLClass extends Thread { 
     Handler mHandler; 
     @Override 
     public void run() { 
      super.run(); 
      Looper.prepare(); 
      mHandler = new Handler(){ 
       @Override 
       public void handleMessage(Message msg) { 
        super.handleMessage(msg); 
        Log.d("HLClass","In Handler, Msg = "+msg.arg1); 
       } 
      }; 
      Looper.loop(); 
     } 
    } 

Dies ist, wie ich versuche, Handler zu nennen:

HLClass hlc = new HLClass(); 
      hlc.start(); 
      Message m = hlc.mHandler.obtainMessage(); 
      m.arg1 = 10; 
      hlc.mHandler.sendMessage(m); 

Fehler:

Verursacht durch: java.lang.NullPointerException: Der Versuch, virtuelle Methode ‚aufzurufen android.os.Message android.os.Handler.obtainMessage() 'auf einem Null-Objekt Referenz

Hier, was ich wirklich versuche zu verstehen, dass, wie ich einen Handler an den Thread anhängen und dann Nachricht von jedem anderen veröffentlichen kann Thread Wie kann ich Message oder Runnable ohne Fehler zum Handler sicher melden.

+0

Was möchten Sie tun? – tyczj

+0

@tyczj Was ich versuche, ist, einen Thread zum Thread hinzuzufügen, damit der Thread in der Methode run() fortlaufend ausgeführt wird. Schreiben Sie dann Nachrichten oder Runnables an den Hanl-Thread. –

Antwort

0

Ein Handler ist eine Komponente, die an einen Thread angehängt werden kann und anschließend über einfache Nachrichten oder Runnable-Tasks Aktionen für diesen Thread ausführen kann. Es funktioniert in Verbindung mit einer anderen Komponente, Looper, die für die Nachrichtenverarbeitung in einem bestimmten Thread zuständig ist.

Wenn ein Handler erstellt wird, kann er im Konstruktor ein Looper-Objekt abrufen, das angibt, an welchen Thread der Handler angeschlossen ist. Wenn Sie einen Handler verwenden möchten, der an den Hauptthread angehängt ist, müssen Sie den Looper verwenden, der dem Hauptthread zugeordnet ist, indem Sie Looper.getMainLooper() aufrufen.

In diesem Fall die Benutzeroberfläche von einem Hintergrund-Thread zu aktualisieren, können Sie einen Handler an den UI-Thread erstellen und dann eine Aktion als Runnable schreiben:

Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
     @Override 
     public void run() { 
      // update the ui from here     
     } 
    }); 

Dieser Ansatz ist viel besser als die erste, aber es gibt eine noch einfachere Möglichkeit, dies zu tun ...

+0

Vielen Dank @ Zhao Lin. Aber hier, was ich wirklich versuche zu verstehen, wie ich einen Handler an den Thread anhängen und dann die Nachricht von einem anderen Thread posten kann. –

+0

Hallo, @Amol K, ich verstehe, was Sie jetzt wollen. Dann ist dein Code fast fertig. Der Fehler besteht darin, dass Sie vor der Initialisierung auf mHandler zugegriffen haben. –

+0

Hallo, @Amol K, ich habe eine weitere Antwort für die Code-Implementierung hinzugefügt. –

0

Sie können folgenden Code zum Senden von Nachrichten versuchen.

final HLClass hlc = new HLClass(); 
hlc.start(); 
new Handler().postDelayed(new Runnable() { 
    public void run() { 
      Message m = hlc.mHandler.obtainMessage(); 
      m.arg1 = 10; 
      hlc.mHandler.sendMessage(m); 
    } 
}, 300); 
+0

Hallo, @ Zhao Lin, danke, es hat funktioniert. Aber immer noch nicht klar, warum wir neue Handler erstellen und Runnable ausführen müssen. Da der Code vor der Verwendung des Handlers in derselben Thread-ID ausgeführt wurde wie die Methode run() des neuen Handlers. Könnten Sie bitte helfen, das zu verstehen? –

+0

Hallo, @Amol K. Die "hlc.start()" nicht direkt "run()" ausführen. Es sendet nur eine Nachricht zum Ausführen. Die Funktion run() wird nach dem Empfang der Anfrage in einem anderen Thread ausgeführt. In Ihrem Code nur den Start und den verwendeten Handler anfordern. In timeframe werden also Funktionen unterhalb von start() vor thread() in thread ausgeführt. Wenn Sie nach dem Ausführen der Funktion, die start() enthält, auf den Handler von einer anderen Anfrage wie der Schaltfläche click klicken, funktioniert es ohne Verwendung des Handlers. –

+0

Sogar das Hinzufügen einer kleinen Verzögerung nach dem Start() funktionierte ebenfalls. Vielen Dank. –

Verwandte Themen