Android WebView JavaScript 回调到原始 View

标签 android webview callback

我正在编写一个 android 应用程序,我在其中将 javascript 代码插入到 webview 中,然后 javascript 通过调用 webview.addJavascriptInterface 指定的 java 方法进行回复。

问题是 javascript-callback 在另一个线程中运行,而不是在我启动进程的原始 View 中运行。因此我无法访问原始 View 。

如何访问原始 View ?

我正在使用 api 级别 7。

这里是重要的代码 fragment :

JavaScript 调用:

webview.addJavascriptInterface(this, "ACall");
webview.loadUrl("javascript: ACall.update();");

回调:

public void update() {
    TextView tv = (TextView) findViewById(R.id.tv);
    Log.v("test", "test");
    tv.setText("test");
}

堆栈跟踪:

Uncaught handler: thread WebViewCoreThread exiting due to uncaught exception
ndroid.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2706)
at android.view.ViewRoot.requestLayout(ViewRoot.java:560)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.view.View.requestLayout(View.java:7918)
at android.widget.TextView.checkForRelayout(TextView.java:5380)
at android.widget.TextView.setText(TextView.java:2684)
at android.widget.TextView.setText(TextView.java:2552)
at android.widget.TextView.setText(TextView.java:2527)
at shylux.android.GameActivity.update(GameActivity.java:53)
at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:149)
at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1449)
at android.webkit.WebViewCore.access$1400(WebViewCore.java:48)
at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:890)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:611)
at java.lang.Thread.run(Thread.java:1096)

////////////////当前解决方案:

这是我目前的解决方案。我认为必须有更好的方法。如果您想执行不同的任务,这需要大量工作。

public void update() {
    tv.post(new UpdateTask());
}

private class UpdateTask implements Runnable {
    public void run() {
        tv.setText("test");
    }
}

最佳答案

谢谢,我遇到了类似的问题。 runOnUiThread 的解决方案非常简单。

您不能从最初创建 Activity 的线程之外更新 Activity 的 UI。 runOnUiThread() 方法用于执行 UI 更改。

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                button.setBackgroundResource(R.drawable.practice_ri_wrong_3);
            }
        });

关于Android WebView JavaScript 回调到原始 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10756104/

相关文章:

android - 理解 Dagger 2 @Component.Builder 注解

webview - react-native webview 嵌入 youtube 视频在 Android 中没有全屏选项

C++ 错误 : 'No suitable conversion function from [class name] to “void *"

java - Java中的回调是同步的吗?

android - Android中的paddingLeft和paddingStart有什么区别?

android - 如何使图像适合我的按钮

java - 修改 JavaFX WebView 中的上下文菜单

c++ - 将函数模板定义为类模板的回调

android - Android 中的 System.currentTimeMillis()?

android - WebView可以用于HTML解析吗?