Javascript 如何强制Android WebView立即重画/重新渲染?

Javascript 如何强制Android WebView立即重画/重新渲染?,javascript,java,android,bluetooth-lowenergy,android-webview,Javascript,Java,Android,Bluetooth Lowenergy,Android Webview,基本上,JavascriptInterface从WebView接收一个单击事件,然后我需要多次更改HTML元素,问题是WebView只显示最后一次更改,这意味着渲染不是立即进行的 问题:如何制作webview.loadUrl(“javascript:updateProgress(20);”立即生效并更改WebView内容 ----- 老问题: 我的WebView中有一个HTML进度条,我可以通过运行WebView.loadUrl(“javascript:updateProgress(20);”)

基本上,
JavascriptInterface
WebView
接收一个单击事件,然后我需要多次更改HTML元素,问题是WebView只显示最后一次更改,这意味着渲染不是立即进行的

问题:如何制作
webview.loadUrl(“javascript:updateProgress(20);”立即生效并更改WebView内容

-----

老问题:

我的WebView中有一个HTML进度条,我可以通过运行
WebView.loadUrl(“javascript:updateProgress(20);”)来简单地更新进度条值
这项工作在
onCreate()
中运行良好

现在,我有一个类,它将二进制数据发送到一个连接的BLE设备,我引用了其中的示例,并添加了一个方法来写入中的特征(发送数据)

问题是当
WriteCharacteristic()
运行时,WebView不会被更新(重画/重新渲染),WebView只在
WriteCharacteristic()
完成后重画/重新渲染,这意味着在进度条100%处

注意:我已经尝试了runOnUiThread(newrunnable(){})

我的问题是,如何强制
mainactivity.webview
立即重新绘制/重新渲染


谢谢,

如我在评论中所述,将长时间运行的进程推到后台线程,然后在ui线程上运行webview更新应该可以实现您希望实现的目标。下面是一个简单的例子:

package com.example.myapplication
导入android.annotation.SuppressLint
导入androidx.appcompat.app.appcompat活动
导入android.os.Bundle
导入android.webkit.JavascriptInterface
导入android.webkit.WebView
导入kotlin.concurrent.thread
类MainActivity:AppCompatActivity(){
lateinit var webView:webView
@SuppressLint(“SetJavaScriptEnabled”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
webView=webView(此)
webView.settings.javaScriptEnabled=true
addJavascriptInterface(此“应用程序”)
setContentView(网络视图)
val html=
"""
函数更新进度(进度){
设el=document.getElementById('progress');
el.innerText=进度;
}
数值:0

开始更新 “.trimIndent() webView.loadData(html、“文本/html”、“UTF-8”) } @JavascriptInterface 有趣的开始日期(){ doSomething() } 私人娱乐{ 线{ 对于(1..100中的i){ runOnUiThread{webView.evaluateJavascript(“updateProgress($i);”,null)} 线程。睡眠(10) } } } }
我猜您应该在后台线程上运行这个
WriteCharacteristic
方法,然后将
webvew.loadUrl(…)
发回主线程。对,
WriteCharacteristic
BluetoothLeService
类的成员,该类用作服务,
mainactivity.bindService(intent,this.mServiceConnection,BIND_AUTO_CREATE)
然而,我现在将尝试你的建议,在后台线程上运行
WriteCharacteristic
。不起作用,我甚至避免了所有可修改的东西,只需JavaScript单击->JS界面->调用MainActivity方法->循环更新进度条…最后仍然只更新。我测试了本主题的所有解决方案谢谢你的c但我的项目是基于Java的,
startUpdates()
必须位于
webview.addJavascriptInterface()所需的公共类MyJSInterface{…}
我相信您将能够将其转换为Java,并将函数移动到您的界面。对不起,如果我这样做,我将得到与现有Java代码相同的Java代码。我将尝试创建一个小而完整的示例,以轻松识别问题。
// JavaScript in WebView
function updateProgress(percentage){

    document.getElementById('progressBar').style.width = percentage + '%';
}
public void WriteCharacteristic(BluetoothGattCharacteristic characteristic, byte[] data, MainActivity mainactivity){

    byte[] data_twenty_byte = new byte [20];
    int progress_count = 0;

    while(get_next_twenty_byte(data, data_twenty_byte)){

        characteristic.setValue(data_twenty_byte);
        mBluetoothGatt.writeCharacteristic(characteristic);

        progress_count++;
        mainactivity.webview.loadUrl("javascript:updateProgress(" + progress_count + ");");
    }
}