强制运行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) {
}
}
我试图强制后台线程发布进度,例如 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) {
}
}