2012-05-25 72 views
3

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

问题是,javascript-callback在另一个线程中运行,而不是从我启动该过程的原始视图中运行。因为我不能访问原始视图。

我如何访问原始视图?

我使用的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"); 
    } 
} 

回答

2

runOnUiThread是你的朋友。只需制作一个Runnable,将需要的更改传递给runOnUiThread即可。 painless threading文章建议您可能会考虑其他一些选项(如果您没有对活动进行处理,则tv.post可能会成为问题)。

+0

好吧,我得到它运行。但正如我已经写道,我希望有一个更好的解决方案。也许已经有这样的班级了?我会正确地阅读无痛的线程文章。希望我能找到有用的东西。 – Shylux

4

谢谢,我有一个类似的问题。 runOnUiThread的解决方案出奇的简单。

您无法从最初创建它的线程之外更新活动的UI。 runOnUiThread()方法用于UI更改。

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