6

WebView를 사용하여 웹 사이트에 로그인하고 콘텐츠를 가져온 다음 콘텐츠가 업데이트 될 때이를 사용자에게 알리는 응용 프로그램을 개발 중입니다. 그러나 WebView를 통해 콘텐트를 얻었지만 WebView를 백그라운드로 실행하기 위해 WebView를 실행할 수있는 방법을 알아야합니다.백그라운드에서 WebView 실행

필자가 이해 하듯이, WebViews는 UI 스레드에서 조작되어야합니다. UI 스레드는 모든 것을 훨씬 어렵게 만듭니다.

앱을 열 었는지 여부에 관계없이 앱에 사용자에게 알릴 수있는 방법에 대한 제안/해결 방법은 무엇입니까?

답변

6

WebView를 단일 스레드에서 조작해야하지만 반드시 WebView를 뷰 계층에 연결하지 않는 한 UI 스레드 일 필요는 없습니다 (그러나 WebView를 뷰 계층에 연결하려는 경우는 제외). WebViews.

명시 적으로 지원되는 (또는 과다하게 테스트 된) 내용은 아니지만 WebView가 서비스에서 실행하지 못하도록 특별한 조치는 없습니다. WebView는 일반적으로 서비스 (getTheme() 등)에서 작동하지 않는 Context에 대한 두 가지 메소드를 호출하므로 ContextWrapper를 사용하여이를 해결해야합니다. 또한 WebView를 속이기 위해 수동으로 WebView.layout으로 전화해서 크기가 있다고 생각해야합니다. 당신이해야 할 일이 더 있을지도 모르지만 그 밖의 것은 생각 나지 않습니다.

+0

HTML 선택 대화 상자에서 충돌이 발생하면 https://code.google.com/p/android-developer-preview/issues/detail?id=359#c7을 참조하십시오. –

+2

이것은 더 이상 사실로 보이지 않습니다. UI 스레드 여야합니다. 다른 스레드에서 WebView를 만들려고하면 "java.lang.RuntimeException : java.lang.Throwable : Warning : WebView 메서드가 'UtilityWebViewServiceThread'스레드에서 호출되었으며 모든 WebView 메서드는 UI 스레드에서 호출해야합니다. WebView의 이후 버전은 다른 스레드에서의 사용을 지원하지 않을 수 있습니다. " – David

+0

나를 위해 일하며 특별히 "WebView.layout()"수동 호출. 나는 intenservice에서 webview를 만들고있다, 고마워. – carrizo

2

그 뜻은 무엇입니까?

runOnUiThread(new Runnable(){ 
     public void run() { 
      ... something 
     } 
    }); 
1

배경 스레드에서보기를 팽창 시키거나 수정할 수 없습니다. 그러나 웹 페이지의 내용을 원하면 HTTP GET을 사용하여 백그라운드 스레드에서 가져올 수 있습니다. HTML 데이터를 얻으려면 URL에 GET을 사용해야합니다.

관련 문제