Ich bin neu in Android und versuche, den UI-Thread zu verwenden. Daher habe ich eine einfache Testaktivität geschrieben. Aber ich glaube, ich habe etwas falsch verstanden, denn beim Klicken auf die Schaltfläche reagiert die App nicht mehr
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();
}
}
}
}));
}
}
Wickeln Sie es einfach als Funktion ein und rufen Sie diese Funktion in Ihrem Hintergrund-Thread auf.
quelle
final
Sie haben es von hinten nach vorne. Ihr Schaltflächenklick führt zu einem Aufruf von
runOnUiThread()
, dies ist jedoch nicht erforderlich, da der Klick-Handler bereits auf dem UI-Thread ausgeführt wird. AnschließendrunOnUiThread()
startet Ihr Code in einen neuen Hintergrundthread, in dem Sie versuchen, UI-Vorgänge auszuführen , die dann fehlschlagen.Starten Sie stattdessen einfach den Hintergrund-Thread direkt von Ihrem Click-Handler. Schließen Sie dann die Anrufe in
btn.setText()
einen Anruf an einrunOnUiThread()
.quelle
runOnUiThread()
ist jedoch nicht erforderlich, sollte jedoch harmlos sein. Das Javadoc für diese Methode lautet "Führt die angegebene Aktion im UI-Thread aus. Wenn der aktuelle Thread der UI-Thread ist, wird die Aktion sofort ausgeführt. Wenn der aktuelle Thread nicht der UI-Thread ist, wird die Aktion in die Ereigniswarteschlange gestellt des UI-Threads. "quelle
Es gibt verschiedene Techniken, die runOnUiThread () verwenden. Lassen Sie uns alle sehen
Dies ist mein Hauptthread (UI-Thread) namens AndroidBasicThreadActivity, und ich werde ihn auf verschiedene Weise von einem Arbeitsthread aus aktualisieren -
1.) Durch Übergeben der Instanz von Activity als Argument für den Arbeitsthread
2.) Verwenden Sie die Post-Methode (Runnable Runnable) von View im Worker-Thread
3.) Mit der Handler-Klasse aus dem android.os-Paket Wenn wir nicht über den Kontext (this / getApplicationContext ()) oder die Instanz von Activity (AndroidBasicThreadActivity.this) verfügen, müssen wir die Handler-Klasse wie folgt verwenden:
quelle
Wenn Sie in Fragment verwenden, schreiben Sie einfach
quelle
dein dies:
quelle
Wir verwenden Worker Thread, um Apps reibungsloser zu gestalten und ANRs zu vermeiden. Möglicherweise müssen wir die Benutzeroberfläche nach dem umfangreichen Prozess in Worker Tread aktualisieren. Die Benutzeroberfläche kann nur über den UI-Thread aktualisiert werden. In solchen Fällen verwenden wir Handler oder runOnUiThread. Beide haben eine Runnable-Ausführungsmethode, die im UI-Thread ausgeführt wird. Die onClick-Methode wird im UI-Thread ausgeführt, sodass runOnUiThread hier nicht verwendet werden muss.
Kotlin benutzen
Während der Aktivität,
Aus Fragment,
Mit Java ,
quelle
Sie können aus diesem Beispiel verwenden:
Im folgenden Beispiel verwenden wir diese Funktion, um das Ergebnis einer Synonym-Suche zu veröffentlichen, die von einem Hintergrund-Thread verarbeitet wurde.
Um das Ziel während des OnCreate-Aktivitätsrückrufs zu erreichen, richten wir onClickListener so ein, dass searchTask für einen erstellten Thread ausgeführt wird.
Wenn der Benutzer auf die Schaltfläche Suchen klickt, wird eine anonyme Runnable-Klasse erstellt, die nach dem in R.id.wordEt EditText eingegebenen Wort sucht und den Thread zum Ausführen von Runnable startet.
Nach Abschluss der Suche erstellen wir eine Instanz von Runnable SetSynonymResult, um das Ergebnis über den UI-Thread wieder im Synonym TextView zu veröffentlichen.
Diese Technik ist manchmal nicht die bequemste, insbesondere wenn wir keinen Zugriff auf eine Aktivitätsinstanz haben. Daher werden wir in den folgenden Kapiteln einfachere und sauberere Techniken zum Aktualisieren der Benutzeroberfläche von einer Hintergrund-Computeraufgabe diskutieren.
Quelle :
asynchrone Android-Programmierung Helder Vasconcelos
quelle
So benutze ich es:
quelle
quelle
Versuche dies:
getActivity().runOnUiThread(new Runnable...
Es ist, weil:
1) Das implizite Ergebnis in Ihrem Aufruf von runOnUiThread bezieht sich auf AsyncTask , nicht auf Ihr Fragment.
2) Fragment hat kein runOnUiThread.
Aktivität jedoch.
Beachten Sie, dass Activity die ausführbare Datei nur ausführt, wenn Sie sich bereits im Hauptthread befinden. Andernfalls wird ein Handler verwendet. Sie können einen Handler in Ihrem Fragment implementieren, wenn Sie sich nicht um den Kontext kümmern möchten. Es ist eigentlich sehr einfach:
// Eine Klasseninstanz
// irgendwo anders in deinem Code
// ^ Dies wird immer bei der nächsten Ausführungsschleife im Hauptthread ausgeführt.
quelle