2012-05-25 3 views
3

나는 자바 스크립트 코드를 웹뷰에 삽입 한 후 webview.addJavascriptInterface으로 지정된 자바 메소드를 호출하여 자바 스크립트를 응답하는 안드로이드 애플 리케이션을 작성하고있다.안드로이드 WebView 자바 스크립트 콜백을 원래 뷰로

문제는 자바 스크립트 콜백이 프로세스를 시작한 원래 뷰가 아닌 다른 스레드에서 실행되고 있다는 것입니다. 그 때문에 원래보기에 액세스 할 수 없습니다.

어떻게 원래보기에 액세스 할 수 있습니까?

자바 스크립트 호출 :

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"); 
} 

그리고 스택 트레이스 :

내가 여기 API 레벨 7

을 사용하고

는 중요한 코드 조각입니다

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); 
      } 
     }); 
관련 문제