나는 자바 스크립트 코드를 웹뷰에 삽입 한 후 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");
}
}
괜찮아요. 하지만 이미 쓴대로, 나는 더 나은 해결책이 있기를 바랍니다. 어쩌면 이미 그런 수업이 있을까요? 나는 통증이없는 스레딩 기사를 올바르게 읽을 것이다. 유용한 무언가를 찾을 수 있기를 바랍니다. – Shylux