6

Sto sviluppando un'applicazione che utilizza una WebView per accedere a un sito Web, estrarre il contenuto da esso, quindi avvisare l'utente quando il contenuto viene aggiornato. Ho ottenuto il WebView per ottenere il contenuto, ma ho bisogno di sapere come posso eseguire il WebView come servizio per farlo funzionare in background.Esecuzione di WebView in background

Come ho capito, WebViews deve essere manipolato dal thread dell'interfaccia utente che rende le cose molto più difficili.

Eventuali suggerimenti/soluzioni temporanee su come posso far sì che l'app informi l'utente indipendentemente dal fatto che abbiano l'app aperta o no?

risposta

6

Mentre WebViews deve essere manipolato su un singolo thread, non deve necessariamente essere il thread dell'interfaccia utente (a meno che non si desideri associare WebView alla gerarchia di viste), tuttavia deve essere lo stesso thread per tutti le WebViews.

Sebbene non sia supportato esplicitamente (o sottoposto a severi test di verifica), non c'è nulla di speciale che WebView faccia per impedirvi di eseguirlo in un Servizio. La WebView chiama un paio di metodi sul Contesto che normalmente non funzionano in un servizio (come getTheme()), quindi dovresti aggirare il problema con un ContextWrapper. Avrai anche bisogno di chiamare manualmente WebView.layout per ingannare la WebView pensando che abbia una dimensione. Ci potrebbero essere più cose che avresti bisogno di fare, ma non ti viene in mente nient'altro.

+0

Vedere https://code.google.com/p/android-developer-preview/issues/detail?id=359#c7 se si verificano arresti anomali con le finestre di dialogo di selezione HTML. –

+2

Questo non sembra essere più vero: sembra che sia _must_ il thread dell'interfaccia utente. Quando provo a creare una WebView in un altro thread ottengo: "java.lang.RuntimeException: java.lang.Throwable: Avviso: è stato chiamato un metodo WebView sul thread" UtilityWebViewServiceThread ". Tutti i metodi WebView devono essere richiamati sul thread dell'interfaccia utente. Le versioni future di WebView potrebbero non supportare l'uso su altri thread. " – David

+0

Lavorando per me, specialmente la chiamata manuale "WebView.layout()". Sto creando la webview da un intentservice, grazie. – carrizo

2

Intendi?

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

Non è possibile gonfiare o modificare alcuna vista dal thread in background. Ma se vuoi il contenuto di una pagina web, puoi recuperarlo in un thread in background usando HTTP GET. È necessario utilizzare GET sull'URL per ottenere i suoi dati HTML.