2013-03-19 18 views
9

In meinem WebView habe ich mehrere Links im Header. Im Offline-Modus darf ich nicht erlauben, die Seite neu zu laden und diese Seite so zu belassen, wie sie ist, und dann die Benutzer über die Internetverbindung informieren. Ich bin in der Lage, Links zu fangen, bevor es lädt shouldOverrideUrlLoading, wenn ich andere Links klicke. Aber wenn ich auf denselben Link klicke, wird shouldOverrideUrlLoading nicht ausgelöst, stattdessen wird onLoadResource Methode zuerst aufgerufen. In dieser Methode habe ich versucht webView.stopLoading();, aber es funktioniert weiter und Feuer onReceivedError Methode und zeigt Fehlerbericht auf der Seite.Laden in WebViewClient stoppen

Hier ist mein 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);  
     } 
    }); 

Was ich will, ist in der Lage sein, um sicherzustellen, dass Urls nicht gefeuert werden, wenn sie offline ist und darüber informieren.

Antwort

4

Es ist ein bekanntes Problem und es wird ein Fehler gemeldet. http://code.google.com/p/android/issues/detail?id=2887

Eine Reihe von Problemumgehungen wurde vorgeschlagen. z.B.

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

Zusätzlich registrieren eine BroadcastReceiver zu hören Zustandsänderungen zu vernetzen und die Problemumgehung anwenden, wenn die Konnektivität verloren geht.

+0

Danke für die großartige Antwort. Nun, für ** 1 **, wie Sie in meinem Code oben sehen können, überschrieb ich 'onPageStarted' und versuchte' stopLoading() 'ohne Erfolg. ** 2 **, ich habe darüber nachgedacht, aber in meinem Fall könnte es gefährlich sein, sich auf das ''-Tag zu verlassen, da der Server die Struktur der Seite ändern könnte. Aber der ** 3. ** bezauberte mich wirklich. Wie kam es mir nicht in den Sinn, ich weiß es nicht :). Ich werde es nächste Woche versuchen und Sie wissen lassen, und möglicherweise die Antwort als akzeptiert markieren. – boburShox

+0

Hallo, ich denke, ich kann das Touch-Ereignis nicht deaktivieren, weil ich eine der Seiten zwischenspeichern und im Offline-Modus laden muss. Wenn ich Berührungsereignisse deaktiviere, kann ich sie nicht laden oder was? Wir haben uns eine bestimmte Idee ausgedacht, die nicht sehr gut ist, aber im Moment unseren Bedürfnissen entspricht. Danke nochmal – boburShox

+0

@boburShox: Bitte teilen Sie die Idee – LokiDroid

1

Ich kenne seinen ziemlich alten Beitrag, aber danke für diesen Beitrag, das half mir, das Problem zu lösen !!!

hatte ich ein ähnliches Problem und StopLoading mein Problem gelöst :)

shouldOverrideUrlLoading aufgerufen wird, wenn es auf eine neue Seite geht oder wenn es eine Umleitung jedoch nicht anders wie für ex Klick auf iframe usw. Ich wollte Erzielen Sie das ähnliche Verhalten in meiner App, und ich erkannte, dass onPageStarted zwar aufgerufen wird, aber nicht sollte safeOverrideUrlLoading.

Ich habe onLoadResource nicht überschrieben, sondern nur onPageStarted, da onLoadResource nach onPageStarted aufgerufen wird. OnPageStarted prüft, ob offline und in diesem Fall nicht geladen wird. hoffe das hilft jemandem.

1

Ich denke, in onLoadRessource (..) und onPageStarted() sollte weiter

view.stopLoading(); 

in Ihrem sonst sein {..}