Comment appeler le thread principal à partir du thread secondaire dans Android ?
Réponses
Trop de publicités?Ma recommandation pour faire communiquer des threads dans un même processus est d'envoyer des messages entre ces threads. Il est très facile de gérer cette situation en utilisant des Handlers :
http://developer.Android.com/reference/Android/os/Handler.html
Exemple d'utilisation, de la documentation Android, à la gestion du travail coûteux hors du fil de l'interface utilisateur :
public class MyActivity extends Activity {
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
[ . . . ]
}
protected void startLongRunningOperation() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
mHandler.post(mUpdateResults);
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}
De plus, il est bon de se rappeler que si vous obtenez votre thread secondaire par le biais d'une AsyncTask, vous avez la possibilité d'appeler onProgressUpdate() , onPostExecute() etc., pour effectuer des travaux sur le fil principal.
Exemple de code utilisant HandlerThread
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Handler responseHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Result from UIHandlerThread:"+(int)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
HandlerThread handlerThread = new HandlerThread("UIHandlerThread"){
public void run(){
/* Add your business logic to pupulate attributes in Message
in place of sending Integer 5 as in example code */
Integer a = 5;
Message msg = new Message();
msg.obj = a;
responseHandler.sendMessage(msg);
System.out.println(a);
}
};
handlerThread.start();
}
}
Explication :
-
Dans l'exemple ci-dessus,
HandlerThread
poster unMessage
surHandler
de UI Thread, qui a été initialisé avecLooper
de l'UI Thread.final Handler responseHandler = new Handler(Looper.getMainLooper())
-
responseHandler.sendMessage(msg);
envoieMessage
deHandlerThread
à l'UI ThreadHandler
. -
handleMessage
processusMessage
reçu leMessageQueue
et montre un Toast sur le fil de l'UI.