2010-10-13 3 views
2

Dans Handler, nous pouvons transmettre des données à partir d'un fil d'arrière-plan du thread d'interface utilisateur comme ceci:Transmission de données du thread bg au thread UI à l'aide du gestionnaire?

private void someBackgroundThreadOperation() { 
    final String data = "hello"; 
    handler.post(new Runnable() { 
     public void run() { 
      Log.d(TAG, "Message from bg thread: " + data); 
     } 
    } 
} 

Si nous utilisons ce qui précède, nous ne pouvons pas utiliser alors Handler.removeCallbacks (Runnable r), parce que nous avons gagné » t avoir des références à l'une des runnables anonymes que nous avons créé ci-dessus.

Nous pourrions créer une seule instance Runnable, et après que le gestionnaire, mais il ne nous permettra pas de passer des données par:

private void someBackgroundThreadOperation() { 
    String data = "hello"; 
    handler.post(mRunnable); // can't pass 'data' through. 
} 

private Runnable mRunnable = new Runnable() { 
    public void run() { 
     Log.d(TAG, "What data?"); 
    } 
} 

Nous pouvons cependant utiliser les Handler.removeCallbacks (mRunnable) méthode alors, puisque nous avons une référence à celui-ci. Je sais que je peux configurer moi-même la synchronisation pour que la deuxième méthode fonctionne, mais je me demande si Handler offre un utilitaire pour passer des données à un seul Runnable référencé, comme dans l'exemple ci-dessus?

Le plus proche que je peux penser de parcourir les documents est d'utiliser quelque chose comme:

private void someUiThreadSetup() { 
    mHandler = new Handler(new Callback() { 
     @Override 
     public boolean handleMessage(Message msg) { 
      String data = (String)msg.obj; 
      return false; 
     } 
    }); 
} 

private void someBackgroundThreadOperation() { 
    String data = "please work"; 
    Message msg = mHandler.obtain(0, data); 
    mHandler.sendMessage(msg); 
} 

private void cleanup() { 
    mHandler.removeMessages(0); 
} 

Est-ce la bonne façon de le faire?

Merci

+0

Je l'utilise plusieurs fois (String data = (String) msg.obj;) –

Répondre

Questions connexes