티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
WebView methods on same thread error
WebView 스레드 오류(All WebView methods must be called on the same thread) 수정하기
문제 내용
I have a android program (Java + html in a webview). I can call from the javascript to the Java code. But the other way around stopped working (after updating in eclipse).
저는 안드로이드 프로그램 (Java + 웹뷰 내 HTML)을 가지고 있습니다. 제가 자바스크립트에서 자바 코드를 호출할 수는 있지만, 그 반대로는 (이클립스에서 업데이트 후) 작동하지 않습니다.
So this is what I'm trying to do
제가 하려는 것은 다음과 같습니다.
- Make a webview (worked)
- calling in javascript to AndroidFunction.test(); (worked)
- the java test() function call webView.loadUrl("javascript:helloBack()"); (! not working anymore)
웹뷰 만들기 (작동함)
자바스크립트에서 AndroidFunction.test()를 호출하기 (작동함)
자바의 test() 함수가 webView.loadUrl("javascript:helloBack()"); 호출하기 (! 더 이상 작동하지 않음)
I tried to let it work with the WebView in the MainActivity, but it didnt work.
제가 WebView를 MainActivity에서 작동시켜 보았지만, 작동하지 않았습니다.
MainActivity.java
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final WebView webView = (WebView)findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient());
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
javascr = new Javascript(this, webView);
webView.addJavascriptInterface(javascr, "AndroidFunction");
webView.loadUrl("file:///android_asset/www/index.html");
....
}
Javascript.java
public class Javascript {
Context cont;
WebView webView;
Javascript(Context c, WebView w) {
cont = c;
webView = w;
}
// function called in the javascript by AndroidFunction.test();
public void test() {
// Breaking point!!!
webView.loadUrl("javascript:helloBack()");
}
Error:
오류:
03-24 11:47:50.103: W/WebView(21026): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper{41ab68f8} called on Looper{41bb70a8}, FYI main Looper is Looper{41ab68f8})
03-24 11:47:50.103: W/WebView(21026): at android.webkit.WebView.checkThread(WebView.java:2063)
03-24 11:47:50.103: W/WebView(21026): at android.webkit.WebView.loadUrl(WebView.java:794)
03-24 11:47:50.103: W/WebView(21026): at com.example.hellobt.Javascript.test(Javascript.java:24)
03-24 11:47:50.103: W/WebView(21026): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
03-24 11:47:50.103: W/WebView(21026): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)
03-24 11:47:50.103: W/WebView(21026): at android.os.Handler.dispatchMessage(Handler.java:102)
03-24 11:47:50.103: W/WebView(21026): at android.os.Looper.loop(Looper.java:137)
03-24 11:47:50.103: W/WebView(21026): at android.os.HandlerThread.run(HandlerThread.java:61)
Thanks for the answer. I edited the function in my Javascript file like this:
답변해주셔서 감사합니다. 저는 JavaScript 파일에서 함수를 다음과 같이 수정했습니다.
private void test(final String s) {
webView.post(new Runnable() {
public void run() {
webView.loadUrl("javascript:" + s + ";");
}
});
System.out.println("javscript done..");
}
높은 점수를 받은 Solution
The JavaScript method is executed on a background (i.e. non-UI) thread. You need to call all Android View related methods on the UI thread. You can achieve what you need with:
자바스크립트 메소드는 백그라운드(즉, UI가 아닌) 스레드에서 실행됩니다. Android View 관련 메소드는 모두 UI 스레드에서 호출해야 합니다. 다음과 같이 UI 스레드에서 실행되도록 작성할 수 있습니다.
mWebView.post(new Runnable() {
@Override
public void run() {
mWebView.loadUrl(...).
}
});
Which will post the task to run on the UI thread.
이렇게 하면 작업이 UI 스레드에서 실행됩니다.
가장 최근 달린 Solution
Java version: You must to use Runnable interface and Post to Handler.
Java 버전: Runnable 인터페이스를 사용하고 Handler에 대한 Post를 사용해야 합니다.
webView.post(new Runnable() {
@Override
public void run() {
webView.loadUrl("file:///android_asset/www/index.html");
}
});
Kotlin version:
코틀린 버전:
webView.post(new Runnable {
webView.loadUrl("file:///android_asset/www/index.html")
})
출처 : https://stackoverflow.com/questions/22607657/webview-methods-on-same-thread-error
'개발 > 안드로이드' 카테고리의 다른 글
Android MVVM ViewModel에서 Context 얻기 (0) | 2023.02.15 |
---|---|
Android - WebView에서 화면 회전 시 새로 고침 막는 방법 (0) | 2023.02.14 |
'This Handler class should be static or leaks might occur: IncomingHandler' 오류 수정하기 (0) | 2023.02.13 |
cordova build android" 명령어 실행 중 "unable to find attribute android:fontVariationSettings and android:ttcIndex" 오류 수정하기 (0) | 2023.02.12 |
RecyclerView에서 특정 위치에 있는 뷰 가져오기 (0) | 2023.02.12 |