我有一個Url列表,我想迭代列表以加載其中的每一個,但當嘗試這樣做時,迭代失敗,它只加載列表的最后一項。
最初,當WebView首次開始運行時,會加載此url:
webView.loadUrl("https://translate.google.com/?sl=$from&tl=$into&text=Hello&op=translate")
我有一個URL列表,我想對它們進行迭代:
val items = listOf(
"https://translate.google.com/?sl=$from&tl=$into&text=First text&op=translate",
"https://translate.google.com/?sl=$from&tl=$into&text=Second text&op=translate",
"https://translate.google.com/?sl=$from&tl=$into&text=Third text&op=translate"
)
頁面加載完成后,我在列表上迭代以加載每個url:
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
GlobalScope.launch {
delay(5000)
withContext(Dispatchers.Main) {
items.forEach {
view?.loadUrl(it)
injectJavascript(view)
}
}
}
}
}
我只得到最后一個Url的結果,即“第三個文本”,有什么問題?我該如何使代碼正常工作?
您所面臨的問題是由于WebView的
loadUrl()
函數(shù)異步操作。當您在forEach
循環(huán)中調用loadUrl()
時,它會啟動URL的加載,但不會等待頁面完成加載后再繼續(xù)下一個URL。因此,循環(huán)快速迭代所有URL,只有最后一個URL有機會完全加載,這就是為什么您只看到最后一個網(wǎng)址的結果。要處理此問題,您可以使用queue-like方法,即只有在當前URL完成加載時才加載下一個URL。
For instance:
在本修訂規(guī)范中:
這里,
onPageStarted
和onPageFinished
用于維護一個標志isLoading
,該標志指示W(wǎng)ebView當前是否正在加載頁面。runnable
對象檢查此標志,如果WebView當前沒有加載頁面,它將開始加載下一個URL。這個runnable
對象每5秒被發(fā)布到Handler
。這樣,只有當WebView當前未加載頁面時,才會加載下一個URL。