在 Android 開發中,經常會遇到網路請求、資料庫查詢或複雜運算等耗時操作。若直接在主執行緒呼叫這些方法,程式碼會繼續往下執行,而不等待結果返回,導致邏輯錯誤或應用程式無回應(ANR)。
public void cc() {
String aa = getHtml(); // 這是一個耗時操作(如網路請求)
// 程式碼未等待 aa 返回值,直接執行後續邏輯
// ...
}
核心原則是不要阻塞主執行緒。推薦使用以下現代化方案:
// 在 ViewModel 或 Repository 中
suspend fun fetchHtml(): String = withContext(Dispatchers.IO) {
getHtml() // 耗時操作放在 IO 執行緒
}
// 在 Activity/Fragment 中呼叫
lifecycleScope.launch {
val html = fetchHtml()
// 這裡會等待 fetchHtml 完成,再執行後續 UI 更新
updateUI(html)
}
public void cc() {
new Thread(() -> {
String aa = getHtml(); // 子執行緒執行耗時操作
runOnUiThread(() -> {
if (aa != null) {
// 回到主執行緒更新 UI 或執行後續邏輯
handleResult(aa);
}
});
}).start();
}
Observable.fromCallable(this::getHtml)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::handleResult, this::handleError);
原回答建議用 `if (aa != null)` 來「等待」,但這在主執行緒中無效——`getHtml()` 若是同步阻塞呼叫,主執行緒會卡死;若是非同步回調,`aa` 依然會是 null。正確做法是採用非同步回調、協程或 Reactive Streams 等機制。
掌握非同步程式設計,是打造流暢、穩定 Android 應用的關鍵技能。