Comment appeler le fil principal du fil secondaire dans Android?Appelez le fil principal du fil secondaire dans Android
Répondre
La façon la plus simple est d'appeler runOnUiThread (...) à partir de votre fil
activity.runOnUiThread(new Runnable() {
public void run() {
... do your GUI stuff
}
});
Ma recommandation de communiquer des threads dans le même processus est l'envoi de messages entre ces threads. Il est très facile de gérer cette situation en utilisant Handlers:
http://developer.android.com/reference/android/os/Handler.html
Exemple d'utilisation, de la documentation Android, à la manipulation coûteux travail hors du fil ui:
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
[ . . . ]
}
}
Merci! Fonctionne comme un charme !! : D –
Vous aurez besoin d'un Handler
qui transmet les informations au thread principal.
En outre, il est bon de se rappeler que si vous obtenez votre fil secondaire à travers un AsyncTask, vous avez la possibilité d'appeler onProgressUpdate() , onPostExecute(), etc., pour travailler 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
afficher unMessage
surHandler
de l'interface utilisateur de cette discussion, qui a été initialisé avecLooper
de l'interface utilisateur fil.final Handler responseHandler = new Handler(Looper.getMainLooper())
responseHandler.sendMessage(msg);
envoieMessage
deHandlerThread
à l'interface utilisateur DiscussionHandler
.handleMessage
processusMessage
reçus surMessageQueue
et affiche un Toast sur le thread UI.
Veuillez préciser ce que vous essayez de faire. –