Ich habe einen Worker-Thread, der ein runnable-Objekt erstellt und runOnUiThread darauf aufruft, weil er sich mit Ansichten und Steuerelementen beschäftigt. Ich möchte das Ergebnis der Arbeit des runnable-Objekts sofort verwenden. Wie kann ich warten, bis es fertig ist? Es stört mich nicht, wenn es blockiert ist.
Antworten
Zu viele Anzeigen?Für den Fall, dass jemand bei der Entwicklung einer Xamarin-Anwendung mit diesem Problem konfrontiert wird, hinterlasse ich hier meinen C#-Code, der diesen Trick ermöglicht.
Mein RecyclerView-Adapter wurde zu spät gesetzt, so dass es null in meinem ScrollListener-Konstruktor zurückgegeben wurde. Auf diese Weise wartet mein Code darauf, dass der UI-Thread die Arbeit beendet und die "Sperre" freigibt.
All dies läuft innerhalb eines Fragments ab (Activity liefert das übergeordnete Activity-Objekt).
Semaphore semaphore = new Semaphore(1, 1);
semaphore.WaitOne();
Activity?.RunOnUiThread(() =>
{
leaderboard.SetAdapter(adapter);
semaphore.Release();
});
semaphore.WaitOne();
scrollListener = new LazyLoadScrollListener(this, (LinearLayoutManager)layoutManager);
leaderboard.SetOnScrollListener(scrollListener);
semaphore.Release();
Ich hoffe, es hilft jemandem.
So mache ich es mit der Kotlin Extension
Erweiterungsfunktion hinzufügen, um den Thread zu prüfen und im UI-Thread auszuführen
fun Context.executeOnUIThreadSync(task: FutureTask<Boolean>) {
if (Looper.myLooper() == Looper.getMainLooper()) {
task.run()
} else {
Handler(this.mainLooper).post {
task.run()
}
}
}
Er blockiert den UI-Thread und wartet auf die Rückkehr
fun checkViewShown(): Boolean {
val callable: Callable<Boolean> = Callable<Boolean> {
// Do your task in UI thread here
myView != null && myView?.parent != null
}
val task: FutureTask<Boolean> = FutureTask(callable)
applicationContext.executeOnUIThreadSync(task)
return task.get()
}
Verwenden Sie die Klasse AsyncTask, deren Methoden onPostExecure und onProgressUpdate vom MAIN-Thread (dem UI-Thread) ausgeführt werden.
http://developer.Android.com/reference/Android/os/AsyncTask.html
Das ist der bessere Weg für Ihren Fall!
Ich hoffe, dies kann Ihnen helfen.
- See previous answers
- Weitere Antworten anzeigen