首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 線程間數據傳遞:使用 Handler 機制或 AsyncTask 替代阻塞 join()

     編輯:程式設計綜合問答

子線程執行耗時任務後需通知 UI 線程更新,用 t.join() 會阻塞 UI 線程,違背多線程初衷。正確方式:Handler 發送消息、runOnUiThread、AsyncTask 或現代 Kotlin Coroutines/RxJava。

Handler 經典模式

// 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();

runOnUiThread 簡化

new Thread(() -> {
    Car car = new Car();
    car.takePetrol();
    runOnUiThread(() -> updateUI(car.getPetrol()));
}).start();

AsyncTask(已棄用但仍可用)

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

現代最佳:Kotlin Coroutines

lifecycleScope.launch(Dispatchers.IO) {
    Car car = Car().also { it.takePetrol() }
    withContext(Dispatchers.Main) {
        updateUI(car.petrol)
    }
}

拒絕 join() 阻塞主線程,拥抱異步回調與結構化並發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved