强制运行OnUiThread

Forcing runOnUiThread

我试图强制后台线程发布进度,例如 AsyncTask,但我失败得很惨。我不明白为什么它不起作用。

我这样开始后台线程:

new Thread(() -> {
    doInBackground();
}).start();

doInBackground() 中,我有一个这样的循环:

...
synchronized (this) {
    ...
    for (int i = 0; i < 100000; i++) {
        ...
        if (i % 100 == 0) {
           System.out.println("### INNER ### ");
           activity.runOnUiThread(this::onProgressUpdate);
        }
    }
 }

onProgressUpdate()就是

onProgressUpdate() {
     System.out.println("-------------");
}

我期望的是,对于每个 ### INNER ### ,我都会看到一个插入的 -------------。然而,我首先看到所有 ### INNER ### ,然后是所有 -------------。所以行

activity.runOnUiThread(this::onProgressUpdate);

在我想要的时刻没有被执行。我尝试在各处添加和删除几个 synchronized (this),但没有成功。

我做错了什么?

也许您可以针对您的用例尝试类似下面的操作。

  val semaphore = Semaphore(1)
        val mainHandler = Handler(Looper.getMainLooper())
        for (your logic) {
            try {
                semaphore.acquire()
                mainHandler.post {
                    /* do your main ui work*/
                    semaphore.release()
                }
            } catch (e: Exception) {

            } 
        }