我正在写一个机器人应用程序,其中我在网络视图中插入正本代码,然后通过调用“编码”webview.addJavacript Interface 所指定的java方法来回答正本回答。
问题是, javascript- recall 正在另一条线上运行, 而不是我启动此进程的原始视图。 因此我无法访问原始视图 。
我怎样才能进入原始视图?
我使用Api 7级。
以下是重要的代码碎片:
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");
}
}