2017-08-08 2 views
1

Dears. Ich studiere Android-Entwicklung und ich bin auf Handlers/Loopers und MessageQueue fest. Laut Dokumentation, Handlers sind in der Lage nachrichts und Post (Runnable) zu einem anderen Thread, also habe ich versucht, die folgenden:Verwenden von Handler zu sendMessage in Android

Ich habe zwei Java-Dateien, eine für eine andere Klasse:

public class MyThread extends Thread { 
    public MyThread(String argument) { 
     //save the arguments to some member attribute 
    } 

    @Override 
    public void run() { 
     //calculate something 
     String result = doSomething(); 

     //now I need send this result to the MainActivity. 
     //Ive tried this 
     Bundle bundle = new Bundle(); 
     bundle.putString("someKey", result); 
     Message msg = Message.obtain(); 
     msg.what = 2; 
     msg.setData(bundle); 

     //I hope this could access the Main Thread message queue 
     new Handler(Looper.getMainLooper()).sendMessage(msg); 
    } 
} 

und meine Haupttätigkeit:

public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstance) { 
     //super and inflate the layout 
     //use findViewById to get some View 
    } 

    //I think this could access the same MessageQueue as the thread did 
    private Handler mHandler = new Hander() { 
     @Override 
     public void handleMessage(Message msg) { 
      if (msg.what == 2) { 
       //I thought the sendMessage invoked inside the Thread 
       //would go here, where I can process the bundle and 
       //set some data to a View element and not only Thread change 
      } 
     } 
    } 
} 

Da konnte ich nicht verstehen, wie es funktioniert wirklich die Beispiele und die Dokumentation zu lesen, würde ich eine einfache Erklärung mag in wie kann ich einige Daten aus einem Thema bekommen (was nicht weiß, die MainActivity) angezeigt werden o Ein Blick in Aktivität oder Fragment.

Dank

+0

von wo Sie gestartet MyThread – Rahul

+0

Derzeit von einer Schaltfläche onClick innerhalb MainActivity. –

Antwort

1

Ich denke, im Grunde erstellt man 2-Handler auf dem UI-Thread von der Implementierung. Deshalb wurden Sie in der MainActivity nicht zurückgerufen.

Sie können einen Verweis auf den mHandler in MyThread abrufen und sendMessage() darauf aufrufen. Auf diese Weise verwenden Sie einen einzelnen Handler für Ihren Job.

+0

Sie haben Recht.Ich habe herausgefunden, dass der Haupt-Thread bereits einen eigenen impliziten Handler hat. Auch wenn ich einen neuen (innerhalb des Threads) erzeuge, der den MainLooper passiert, ist es nicht derselbe Handler, der bereits an den MainThread gebunden ist. Um dies zu lösen, musste ich den MainThread Handler an den MyThread übergeben und ihn verwenden, um die Nachrichten zu senden. Danke für die Klarstellung. –

0

In Ihrem Beispiel Haupt Looper.getMainLooper() ist, bedeutet dies, wird die Nachricht an die Handler senden, die auf dem UI-Thread angebracht ist, in Ihrem Fall wird MainActivity in UI-Thread ausgeführt wird, und es hat Handler in der Name von Handler so die Nachricht wird bei handleMessage davon erhalten.

Sie können mehr über Looper lesen, Communicating with the UI Thread, Handler