Android Получение Html DOM Webview с использованием сопрограммJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Android Получение Html DOM Webview с использованием сопрограмм

Сообщение Anonymous »

Я пишу этот код, чтобы использовать его для получения DOM HTML-страницы, загруженной в веб-просмотр после получения. Я хочу обработать DOM с помощью библиотеки DukTape с удаленным файлом JS (для обработки любых будущих изменений DOM). структуру, не заставляя пользователя обновлять приложение) код предназначен для проекта Kotlin android:
Сначала код Duktape для хостинга фрагментов:
val duktape = Duktape.create()
// Bind the RetrofitBridge instance to Duktape

val webView = binding.unvisibleWebview
val retrofitBridge = RetrofitBridge(webView)
duktape.set("retrofitBridge", AndroidNetworking::class.java, retrofitBridge)

try {
// Execute JavaScript code
val jsCode = """var result = retrofitBridge.webViewRequest("https://jsonplaceholder.typicode.com/posts"); result; // Return the result to Kotlin"""

val result = duktape.evaluate(jsCode)
Log.d("ResponseHtml", result.toString())
println(result) // Print the output
} catch (e: Exception) {
e.printStackTrace()
} finally {
duktape.close() // Clean up resources
}

2- Сетевой интерфейс Duktape Android:
interface AndroidNetworking {
fun getRequest(url: String): String
fun postRequest(url : String): String
fun webViewRequest(url: String): String
}

3- Реализация webViewRequest:
override fun webViewRequest(url: String): String {
var resultHtml: String? = null

WebViewClientRequest(webView, url) { html ->
resultHtml = html
}
return resultHtml ?: ""
}


4- Класс WebViewClientRequest:
class WebViewClientRequest(
private val webView: WebView,
private val url: String,
) {

init {
val webSettings = webView.settings
webSettings.javaScriptEnabled = true
webSettings.userAgentString =
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36"

val cookieManager = CookieManager.getInstance()
cookieManager.setAcceptCookie(true)
cookieManager.setAcceptThirdPartyCookies(webView, true)

webView.addJavascriptInterface(JsInterface(), "HTMLOUT")
webView.webViewClient = WebClientFetchData()

webView.loadUrl(url)
}

inner class WebClientFetchData : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
// Inject JavaScript to fetch the HTML content
webView.loadUrl(
"javascript:window.HTMLOUT.showHTML(''+document.getElementsByTagName('html')[0].innerHTML+'');"
)
}

override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {
super.onReceivedError(view, request, error)
println("Error loading page: $error")
}
}

inner class JsInterface {
@JavascriptInterface
fun showHTML(html: String) {
println(html)
}
}
}


я хочу реализовать, чтобы не возвращать webViewRequest до тех пор, пока DOM не будет очищен без изменения webViewRequest для приостановки функции для работы с dukeTape
я пытался использовать runBlocking бесполезно, также я попробовал следующее, но не могу передать данные в DukTape
runBlocking {
WebViewClientRequest(webView, url) { html ->
resultHtml = html
}
}

CoroutineScope(Dispatchers.Main).launch {
WebViewClientRequest(webView, url) { html ->
resultHtml = html
}
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... coroutines
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»