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

Android Handler 異步解析數據傳遞到 onCreate:時序衝突與正確模式

     編輯:程式設計疑難解答

核心衝突

`onCreate()` **先於** `Handler.handleMessage()` 執行。`onCreate` 時 `Handler` 尚未收到消息,`url` 為空。

錯誤嘗試


// 錯誤:試圖在 onCreate 獲取 Handler 異步解析出的 url
protected void onCreate(Bundle savedInstanceState) {
    // ...
    String excerpt_URL = getIntent().getStringExtra("newsurl"); // 為空
    webView.loadUrl(excerpt_URL); // 空指針或加載空頁
}

正確模式:在 Handler 內直接操作 WebView


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 傳遞場景

若解析在 **上一個 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` 啟動下一個。

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