子線程執行耗時任務後需通知 UI 線程更新,用 t.join() 會阻塞 UI 線程,違背多線程初衷。正確方式:Handler 發送消息、runOnUiThread、AsyncTask 或現代 Kotlin Coroutines/RxJava。
// UI 線程創建 Handler
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
Car car = (Car) msg.obj;
updateUI(car.getPetrol());
}
};
// 子線程
new Thread(() -> {
Car car = new Car();
car.takePetrol();
Message msg = handler.obtainMessage(0, car);
handler.sendMessage(msg);
}).start();
new Thread(() -> {
Car car = new Car();
car.takePetrol();
runOnUiThread(() -> updateUI(car.getPetrol()));
}).start();
new AsyncTask() {
@Override
protected Car doInBackground(Void... voids) {
Car car = new Car();
car.takePetrol();
return car;
}
@Override
protected void onPostExecute(Car car) {
updateUI(car.getPetrol());
}
}.execute();
lifecycleScope.launch(Dispatchers.IO) {
Car car = Car().also { it.takePetrol() }
withContext(Dispatchers.Main) {
updateUI(car.petrol)
}
}
拒絕 join() 阻塞主線程,拥抱異步回調與結構化並發。