2013-03-19 20 views
9

Nella mia WebView, ho più collegamenti nell'intestazione. In modalità Offline, non devo permettere di ricaricare la pagina e mantenere quella pagina così com'è e quindi informare gli utenti sulla connessione internet. Sono in grado di catturare i collegamenti prima che carichi utilizzando shouldOverrideUrlLoading se faccio clic su altri collegamenti. Ma se clicco sullo stesso link, shouldOverrideUrlLoading non viene sparato, viene invece chiamato prima il metodo onLoadResource. In questo metodo ho provato webView.stopLoading(); ma continua a funzionare e spara al metodo onReceivedError e mostra la segnalazione degli errori nella pagina.interrompe il caricamento in webViewClient

Ecco il mio WebClient:

webView.setWebViewClient(new WebViewClient() { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if(MyApplication.getInstance().isOnline()) { 
       return false; 
      } 

      Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.i("ON_PAGE_START", "RUNNING ============>" + url); 
      if (MyApplication.getInstance().isOnline()) { 
       super.onPageStarted(view, url, favicon); 
      } else { 
       webView.stopLoading(); 
      } 
     } 

     @Override 
     public void onLoadResource(WebView view, String url) { 

      if (MyApplication.getInstance().isOnline()) { 
       super.onLoadResource(view, url); 
      } else { 
       webView.stopLoading();     
      } 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {    

      view.stopLoading(); 

      Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show(); 
      super.onReceivedError(view, errorCode, description, failingUrl);  
     } 
    }); 

Quello che voglio è essere in grado di garantire che gli URL non vengono licenziati se non è in linea e informare su questo.

risposta

4

È un problema noto e viene segnalato un errore. http://code.google.com/p/android/issues/detail?id=2887

È stata suggerita una serie di soluzioni alternative. per esempio.

  1. Override onPageStarted
  2. Add JavascriptInterface da CommonsWare
  3. Disable WebView touch events

Inoltre, registrare un BroadcastReceiver per ascoltare rete cambiamenti di stato e di applicare la soluzione quando la connettività viene persa. Network listener Android

+0

Grazie per la grande risposta. Bene, per ** 1 **, come puoi vedere nel mio codice sopra, ho fatto override di 'onPageStarted' e ho provato' stopLoading() 'senza successo. ** 2 **, in realtà ci ho pensato, ma nel mio caso potrebbe essere _dangerous_ fare affidamento sul tag ' 'dal momento che il server potrebbe cambiare la struttura della pagina. Ma il ** 3 ** mi ha davvero affascinato. Come non mi è venuto in mente, non lo so :). Ci proverò la settimana prossima e ti faccio sapere, e forse segnerò la risposta come accettata. – boburShox

+0

Ciao, penso di non poter disabilitare l'evento di tocco, perché devo memorizzare nella cache una delle pagine e caricare in modalità offline. Se disattivo gli eventi tattili, non potrò caricarlo, o cosa? Abbiamo avuto un'idea specifica che non è molto buona, ma adeguata ai nostri bisogni per il momento. Grazie ancora – boburShox

+0

@boburShox: Si prega di condividere l'idea – LokiDroid

1

So che è piuttosto un vecchio post ma grazie per questo post, questo mi ha aiutato a risolvere il problema !!!

Ho avuto un problema simile e StopLoading risolto il mio problema :)

shouldOverrideUrlLoading viene chiamato se va a una nuova pagina o se c'è un reindirizzamento, ma non altrimenti, come per es click su iframe ecc volevo ottenere il comportamento simile nella mia app e mi sono reso conto che onPageStarted è stato chiamato ma non dovrebbe OverVerversoLoading.

Non ho eseguito l'override suLoadResource ma solo suPageStarted poiché onLoadResource viene chiamato dopo onPageStarted. OnPageStarted controlla se è offline e non si carica in quel caso. spero che questo aiuti qualcuno.

1

Penso che in onLoadRessource (..) e onPageStarted() ulteriormente dovrebbe essere

view.stopLoading(); 

nel vostro else {..}