`onCreate()` **先於** `Handler.handleMessage()` 執行。`onCreate` 時 `Handler` 尚未收到消息,`url` 為空。
// 錯誤:試圖在 onCreate 獲取 Handler 異步解析出的 url
protected void onCreate(Bundle savedInstanceState) {
// ...
String excerpt_URL = getIntent().getStringExtra("newsurl"); // 為空
webView.loadUrl(excerpt_URL); // 空指針或加載空頁
}
public class NewsDetailActivity extends AppCompatActivity {
private WebView webView;
private final Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
String url = msg.getData().getString("url");
if (webView != null && url != null) {
webView.loadUrl(url); // 關鍵:這裡直接加載,不依賴 onCreate 時序
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_browse_news);
webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
// 啟動異步解析 (假設工具類回調發送 Message 到此 handler)
String newsId = getIntent().getStringExtra("news_detail");
NewsDetailUtils.getNewsDetailJSON(newsId, handler);
}
}
若解析在 **上一個 Activity** 的 Handler 中,解析完再啟動本 Activity:
// 上一個 Activity 的 Handler
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
String url = msg.getData().getString("url");
Intent intent = new Intent(PrevActivity.this, NewsDetailActivity.class);
intent.putExtra("newsurl", url); // 通過 Intent 傳遞
startActivity(intent);
}
};
**異步結果不可強行同步到 `onCreate`**。兩種正確模式:
1. 同一 Activity:`onCreate` 初始化 UI,`Handler` 異步回調中直接操作 UI。
2. 跨 Activity:上一個 Activity 異步回調拿到數據後,攜帶數據 `startActivity` 啟動下一個。