54 Stimmen

wie zu warten, bis Android runOnUiThread beendet ist?

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.

0voto

Sergi Mascaró Punkte 374

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.

0voto

Hitesh Sahu Punkte 37527

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()
    }

-2voto

pedr0 Punkte 2832

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X