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

Android XML 解析錯誤:網路請求需在背景執行緒執行

     編輯:程式設計綜合問答

錯誤現象

應用啟動時 XMLParser 崩潰,錯誤堆疊指向 DefaultClientConnectionOperator.openConnection。這是典型的「在主執行緒執行網路操作」導致的 NetworkOnMainThreadException(Android 3.0+ 嚴格模式預設攔截)。

程式碼分析

提供的 XMLParser.getXmlFromUrl() 方法在主執行緒同步呼叫 HttpClient.execute(),違反 Android 單執行緒模型規範。主執行緒負責 UI 繪製,不可阻塞等待網路 I/O。

正確解決方案

不建議使用 StrictMode.ThreadPolicy.permitAll() 繞過檢查,這只是掩蓋問題,會導致 ANR。應採用以下任一現代寫法:

方案一:Kotlin 協程 + Retrofit/OkHttp(推薦)

// ViewModel 或 Repository 中
suspend fun fetchXml(url: String): String = withContext(Dispatchers.IO) {
    OkHttpClient().newCall(Request.Builder().url(url).build()).execute().use { it.body?.string() ?: "" }
}

方案二:AsyncTask(舊專案維護用)

private class FetchXmlTask : AsyncTask() {
    override fun doInBackground(vararg urls: String): String {
        return try {
            val client = DefaultHttpClient()
            val response = client.execute(HttpPost(urls[0]))
            EntityUtils.toString(response.entity)
        } catch (e: Exception) { "" }
    }
    override fun onPostExecute(xml: String) { /* 解析 XML 並更新 UI */ }
}

方案三:Thread + Handler(基礎寫法)

Thread {
    val xml = getXmlFromUrl(url)
    handler.post { parseAndUpdate(xml) }
}.start()

補充建議

  • 棄用 DefaultHttpClient,改用 OkHttp 或 HttpURLConnection。
  • XML 解析建議改用 XmlPullParser 或 SimpleXml,效能優於 DOM。
  • 網路請求務必加入逾時、重試與錯誤處理邏輯。

核心原則:耗時操作(網路、IO、複雜運算)必須離開主執行緒,才能構建流暢穩定的 Android 應用。

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