在 Android 中,我们不能直接在非 UI 线程(例如后台线程)中使用 wait() 和 notify() 或 notifyAll() 方法
使用 runOnUiThread:
在你的后台线程中,将需要更新的 UI 操作包装到 runOnUiThread 方法中。这将确保操作在主线程(UI 线程)上执行。
new Thread(new Runnable() {
@Override
public void run() {
// 执行耗时任务
final String result = doSomeLongRunningTask();
// 在主线程中更新 UI
runOnUiThread(new Runnable() {
@Override
public void run() {
updateUI(result);
}
});
}
}).start();
使用 Handler:
创建一个 Handler 实例并将其关联到主线程的 Looper。然后,在后台线程中使用 Handler 的 post 方法来执行 UI 更新操作。
private Handler mHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
// 执行耗时任务
final String result = doSomeLongRunningTask();
// 在主线程中更新 UI
mHandler.post(new Runnable() {
@Override
public void run() {
updateUI(result);
}
});
}
}).start();
使用 AsyncTask:
AsyncTask 是一个轻量级的异步类,允许你在后台线程中执行操作,然后在主线程中更新 UI。这是实现此功能的推荐方法。
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... voids) {
// 执行耗时任务
return doSomeLongRunningTask();
}
@Override
protected void onPostExecute(String result) {
// 在主线程中更新 UI
updateUI(result);
}
}.execute();
请注意,wait() 和 notify() 或 notifyAll() 是 Java 的内置方法,它们主要用于协调多个线程之间的操作。在 Android 开发中,我们通常使用上述方法来处理线程间的通信和 UI 更新,而不是直接使用 wait()。