2012-05-25 116 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); 
      } 
     });