Shy*_*lux 5 android callback webview
我正在编写一个Android应用程序,其中我在webview中插入javascript代码,然后javascript通过调用指定的java方法回复webview.addJavascriptInterface.
问题是javascript-callback正在另一个线程中运行,而不是我启动进程的原始视图.因为我无法访问原始视图.
我如何访问原始视图?
我正在使用api 7级.
以下是重要的代码片段:
JavaScript调用:
webview.addJavascriptInterface(this, "ACall");
webview.loadUrl("javascript: ACall.update();");
Run Code Online (Sandbox Code Playgroud)
打回来:
public void update() {
TextView tv = (TextView) findViewById(R.id.tv);
Log.v("test", "test");
tv.setText("test");
}
Run Code Online (Sandbox Code Playgroud)
和堆栈跟踪:
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)
Run Code Online (Sandbox Code Playgroud)
////////////////当前解决方案:
这是我目前的解决方案.我认为必须有更好的方法.如果您想要执行不同的任务,这需要大量的工作.
public void update() {
tv.post(new UpdateTask());
}
private class UpdateTask implements Runnable {
public void run() {
tv.setText("test");
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
谢谢,我遇到了类似的问题.解决方案runOnUiThread非常简单.
您无法从最初创建活动的线程外部更新活动的UI.runOnUiThread()方法用于进行UI更改.
runOnUiThread(new Runnable() {
@Override
public void run() {
button.setBackgroundResource(R.drawable.practice_ri_wrong_3);
}
});
Run Code Online (Sandbox Code Playgroud)
runOnUiThread是你的朋友。只需编写一个 Runnable 来对视图进行所需的更改,并将其传递给 runOnUiThread 即可。这篇无痛线程文章建议了您可以考虑的一些其他选项(如果您没有掌握该活动,那么 tv.post 可能是一个不错的选择)。