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 + ");");
}
}