2017-08-08 2 views
1

Dears. J'étudie le développement Android et je suis coincé sur Handlers/Loopers et MessageQueue. Selon la documentation, Handlers sont capables de sendMessage et post (Runnable) à un autre thread, donc j'ai essayé ce qui suit:Utilisation de Handler pour envoyer un message dans Android

J'ai deux fichiers java, l'un pour une autre classe:

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

et mon activité principale:

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 
      } 
     } 
    } 
} 

depuis que je ne pouvais pas comprendre comment cela fonctionne vraiment la lecture des exemples et de la documentation, je voudrais une explication simple comment puis-je obtenir des données à partir d'un fil (qui ne connaît pas la MainActivity) à afficher int o une vue à l'intérieur d'une activité ou d'un fragment.

Merci

+0

d'où vous avez commencé MyThread – Rahul

+0

Actuellement à partir d'un bouton onClick dans MainActivity. –

Répondre

1

Je pense que vous avez créé essentiellement 2 gestionnaires sur le thread d'interface utilisateur de votre application. C'est pourquoi, dans MainActivity, vous n'avez pas été rappelé.

Vous pouvez essayer d'obtenir une référence du mHandler dans MyThread, et d'appeler sendMessage() dessus. De cette façon, vous utilisez un gestionnaire unique pour votre travail.

+0

Vous avez raison. J'ai compris que le thread principal avait déjà son propre gestionnaire implicite. Même si j'en crée un nouveau (à l'intérieur du Thread) en passant le MainLooper, ce n'est pas le même Gestionnaire qui est déjà lié au MainThread. Pour résoudre ce problème, j'ai dû passer le MainThread Handler à MyThread et l'utiliser pour envoyer les messages. Merci pour votre clarification. –

0

Dans votre exemple principal est Looper.getMainLooper(), cela signifie qu'il enverra le message au Handler qui est attaché au fil de l'interface utilisateur, Dans votre cas, MainActivity est en cours d'exécution dans le thread d'interface utilisateur et il a Handler dans la nom de Handler de sorte que le message recevra au handleMessage de cela.

Vous pouvez en savoir plus sur Looper, Communicating with the UI Thread, Handler