Je suis nouveau sur Android et j'essaie d'utiliser UI-Thread, j'ai donc écrit une activité de test simple. Mais je pense que j'ai mal compris quelque chose, car en cliquant sur le bouton, l'application ne répond plus
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
Enveloppez-le simplement en tant que fonction, puis appelez cette fonction à partir de votre thread d'arrière-plan.
la source
final
)Vous l'avez dos à devant. Votre clic sur le bouton entraîne un appel à
runOnUiThread()
, mais ce n'est pas nécessaire, car le gestionnaire de clics est déjà en cours d'exécution sur le thread d'interface utilisateur. Ensuite, votre code dansrunOnUiThread()
lance un nouveau thread d'arrière-plan, dans lequel vous essayez d'effectuer des opérations d'interface utilisateur, qui échouent ensuite.Au lieu de cela, lancez simplement le thread d'arrière-plan directement à partir de votre gestionnaire de clics. Ensuite, encapsulez les appels
btn.setText()
dans un appel àrunOnUiThread()
.la source
runOnUiThread()
n'est pas nécessaire mais il devrait être inoffensif. Le Javadoc de cette méthode indique "Exécute l'action spécifiée sur le thread d'interface utilisateur. Si le thread actuel est le thread d'interface utilisateur, l'action est exécutée immédiatement. Si le thread actuel n'est pas le thread d'interface utilisateur, l'action est publiée dans la file d'attente d'événements. du thread de l'interface utilisateur. "la source
Il existe plusieurs techniques utilisant runOnUiThread (), voyons tout
Ceci est mon fil principal (fil d'interface utilisateur) appelé AndroidBasicThreadActivity et je vais le mettre à jour à partir d'un fil de travail de différentes manières -
1.) En passant l'instance d'Activity comme argument sur le thread de travail
2.) En utilisant la méthode post (Runnable runnable) de View dans le thread de travail
3.) En utilisant la classe Handler du package android.os Si nous n'avons pas le contexte (this / getApplicationContext ()) ou l'instance Activity (AndroidBasicThreadActivity.this), nous devons utiliser la classe Handler comme ci-dessous -
la source
Si vous utilisez un fragment, écrivez simplement
la source
ton ceci:
la source
Nous utilisons Worker Thread pour rendre les applications plus fluides et éviter les ANR. Nous pouvons avoir besoin de mettre à jour l'interface utilisateur après le processus lourd dans Work Tread. L'interface utilisateur ne peut être mise à jour qu'à partir de UI Thread. Dans de tels cas, nous utilisons Handler ou runOnUiThread ont tous deux une méthode d'exécution Runnable qui s'exécute dans UI Thread. La méthode onClick s'exécute dans le thread d'interface utilisateur, vous n'avez donc pas besoin d'utiliser runOnUiThread ici.
Utilisation de Kotlin
En activité,
De Fragment,
Utilisation de Java ,
la source
Vous pouvez utiliser à partir de cet exemple:
Dans l'exemple suivant, nous allons utiliser cette fonctionnalité pour publier le résultat d'une recherche de synonymes qui a été traitée par un fil d'arrière-plan.
Pour atteindre l'objectif lors du rappel de l'activité OnCreate, nous allons configurer onClickListener pour exécuter searchTask sur un thread créé.
Lorsque l'utilisateur clique sur le bouton Rechercher, nous allons créer une classe anonyme Runnable qui recherche le mot tapé dans R.id.wordEt EditText et démarre le thread pour exécuter Runnable.
Une fois la recherche terminée, nous créerons une instance de Runnable SetSynonymResult pour publier le résultat sur le synonyme TextView via le fil d'interface utilisateur.
Cette technique n'est parfois pas la plus pratique, surtout lorsque nous n'avons pas accès à une instance Activity; Par conséquent, dans les chapitres suivants, nous allons discuter de techniques plus simples et plus propres pour mettre à jour l'interface utilisateur à partir d'une tâche de calcul en arrière-plan.
La source :
programmation asynchrone android Helder Vasconcelos
la source
Voici comment je l'utilise:
la source
la source
Essaye ça:
getActivity().runOnUiThread(new Runnable...
C'est parce que:
1) cela implicite dans votre appel à runOnUiThread fait référence à AsyncTask , pas à votre fragment.
2) Le fragment n'a pas runOnUiThread.
Cependant, Activity le fait.
Notez que Activity exécute simplement le Runnable si vous êtes déjà sur le thread principal, sinon il utilise un Handler. Vous pouvez implémenter un Handler dans votre fragment si vous ne voulez pas vous soucier du contexte, c'est en fait très simple:
// Une instance de classe
// n'importe où ailleurs dans votre code
// ^ ceci sera toujours exécuté sur la prochaine boucle d'exécution sur le thread principal.
la source