Обратный вызов Android WebView JavaScript к исходному представлению

Я пишу приложение для Android, в котором я вставляю код javascript в веб-просмотр, а затем javascript отвечает, вызывая метод java, указанный с помощью webview .addJavascriptInterface.

Проблема в том, что обратный вызов javascript выполняется в другом потоке, а не в исходном представлении, из которого я начал процесс. не могу получить доступ к исходному виду.

Как получить доступ к исходному виду?

Я использую 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");
    }
}
5
задан Shylux 25 May 2012 в 15:31
поделиться