当前位置: 首页 > 知识库问答 >
问题:

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

江俊能
2023-03-14

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

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

- - - - - - - - - - - - - - - - -

老问题:

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

// JavaScript in WebView
function updateProgress(percentage){

    document.getElementById('progressBar').style.width = percentage + '%';
}

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

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

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

注意:我已经尝试了runOnUiThread(新的Runnable() {});

我的问题是,如何强制main活动。webview是否立即重新绘制/重新渲染?

谢谢你,


共有1个答案

刘星火
2023-03-14

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

package com.example.myapplication

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.JavascriptInterface
import android.webkit.WebView
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {

    lateinit var webView: WebView

    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        webView = WebView(this)
        webView.settings.javaScriptEnabled = true
        webView.addJavascriptInterface(this, "app")
        setContentView(webView)

        val html =
            """
            <html>
                <head>
                    <script type='text/javascript'>
                        function updateProgress(progress) {
                            let el = document.getElementById('progress');
                            el.innerText = progress;
                        }
                    </script>
                </head>
                <body>                    
                    <p>Value: <span id='progress'>0</span></p>
                    <button onclick='app.startUpdates();'>Start Update</button>
                </body>
            </html>            
            """.trimIndent()

        webView.loadData(html, "text/html", "UTF-8")
    }

    @JavascriptInterface
    fun startUpdates() {
        doSomething()
    }

    private fun doSomething() {
        thread {
            for (i in 1..100) {
                runOnUiThread { webView.evaluateJavascript("updateProgress($i);", null) }
                Thread.sleep(10)
            }
        }
    }

}
 类似资料:
  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个

  • 由于响应于单击Set Default按钮所做的更改是更改ListView的UserData(),而不更改支持的ObservableList,因此列表不能正确地指示新的默认值。 是否有方法强制ListView重新呈现其ListCells?Android用户在这个问题上提出了成千上万个问题,但JavaFX似乎并不快乐。我可能不得不对支持数组进行“无意义的更改”来强制重绘。 我看到这是为JavaFX2.

  • 所以我有一个包含JTable的应用程序。JTable位于JScrollPane的内部,JScrollPane绘制在JFrame上。 现在,在我的应用程序中,我打开一个新窗口,向该表中添加一个新行,在我单击一个按钮保存更改后,新窗口关闭。 现在我尝试在新窗口关闭后添加这些行: 这里有什么问题?

  • 问题内容: 我有一些自定义验证代码,其中包括$ formatter。(为了正确起见,我将货币以便士存储,但以磅为便士显示。) 如果用户在输入中键入“ 10”(这是一个有效值),则输入移至下一个字段后,输入仍显示“ 10”。 我希望它显示10.00以保持一致性。 如果模型将值更改为1000,那么格式化程序将使该字段显示为“ 10.00”。 我希望格式化程序在field.blur()上运行(只要输入有

  • 我有一个正在添加JLabel的JPanel。然后我想删除所有的JLabel并添加一些新的。 所以我做了以下几点: 这很好。当我在这之后开始一个新线程时,我的问题就出现了,比如: 然后原始JLabels的输出仍然可见。我读到重新验证过程是一个长时间运行的任务,因此firstProducer线程正在启动,而重新验证正在进行并产生冲突。处理这个问题的最佳方法是什么?

  • 编辑:当我拖动边框时,某种刷新被发送,我需要弄清楚并手动发送相同的刷新。 请注意,我已经尝试使用revalidate()和repaint()。 当使用JFrame和JPanel来显示一个框架时,我试图使框架的大小易于改变。 null 此外,一个重要的注意事项是,当您拖动边框时,白条会消失,并正确地重新加载/刷新内容(即使您只是少量拖动)