6

Zajmuję się tworzeniem aplikacji, która wykorzystuje WebView do logowania się do witryny internetowej, pobierania zawartości z niej, a następnie powiadamiania użytkownika o aktualizacji treści. Dostałem WebView, aby uzyskać zawartość, ale muszę wiedzieć, jak mogę uruchomić WebView jako usługę, aby uruchomić go w tle.Uruchamianie WebView w tle

Jak rozumiem, WebView musi zostać zmanipulowany z wątku UI, co znacznie utrudnia sprawę.

Wszelkie sugestie/obejścia tego, w jaki sposób mogę uzyskać aplikację, aby powiadomić użytkownika, niezależnie od tego, czy aplikacja jest otwarta, czy nie?

Odpowiedz

6

Podczas gdy podgląd stron WWW musi być zmanipulowany na pojedynczym wątku, niekoniecznie musi to być wątek interfejsu użytkownika (chyba że chcesz dołączyć widok WebView do hierarchii widoku), jednak musi to być ten sam wątek dla wszystkich WebViews.

Chociaż nie jest to coś jawnie obsługiwane (lub mocno przetestowane), nie ma nic szczególnego, co WebView, aby zapobiec uruchomieniu go w usłudze. WebView wywołuje kilka metod w kontekście, które normalnie nie działają w usłudze (np. GetTheme()), więc musisz obejść to w ContextWrapper. Będziesz także musiał ręcznie zadzwonić pod numer WebView.layout, aby oszukać WebView, sądząc, że ma on rozmiar. Może być więcej rzeczy, które musisz zrobić, ale nic więcej nie przychodzi ci do głowy.

+0

Zobacz, https://code.google.com/p/android-developer-preview/issues/detail?id=359#c7, jeśli masz awarie z oknami wyboru HTML. –

+2

To nie wydaje się już być prawdą - wygląda na to, że musi to być wątek interfejsu użytkownika. Kiedy próbuję utworzyć WebView w innym wątku, otrzymuję: "java.lang.RuntimeException: java.lang.Throwable: Warning: Metoda WebView została wywołana w wątku" UtilityWebViewServiceThread "Wszystkie metody WebView muszą zostać wywołane w wątku UI. Przyszłe wersje WebView mogą nie obsługiwać innych wątków. " – David

+0

Praca dla mnie, szczególnie wywołanie ręczne "WebView.layout()". Tworzę widok internetowy z intentservice, dzięki. – carrizo

2

Masz na myśli?

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

Nie można nadmuchać ani zmodyfikować żadnego widoku z wątku tła. Ale jeśli chcesz zawartość strony internetowej, możesz pobrać go w wątku w tle za pomocą HTTP GET. Aby uzyskać jego dane HTML, musisz użyć polecenia GET na adresie URL.

Powiązane problemy