Android WebView isn't loading cached Website if there is no connection

12,194

Your use of

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

is telling the WebView to load the page from cache, but if it needs anything that isn't in the cache, it looks to the network, and when you have no connection, it will just give you the "page could not be loaded error." This is because sadly not everything is stored in the cache and even with this setting, you will notice the browser using the network.

The only way to get the WebView to ignore no connection is to use the

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);

setting instead. Some images will not load with this setting (because they weren't cached) but it will still load everything it finds in the cache.


One other note unrelated to your question is that in your code, you have setAppCacheMaxSize being used and that has been deprecated in API 18 and above because the WebView manages the cache size itself, so just a heads up about that.

Share:
12,194

Related videos on Youtube

Sargius
Author by

Sargius

Updated on September 29, 2022

Comments

  • Sargius
    Sargius over 1 year

    I am trying to cache the website loaded in WebView but I can't get it working if the network connection is OFF.

    Cachdirectory is created, cached files are there. Permissions are given. I load the WebPage then switch off network (WI-FI permission is also given) and I get the error as I am trying to reload the page (now it should load from cache). Plase help!

    Here is the code:

    WebView engine=(WebView)findViewById(R.id.web_engine);
        engine.getSettings().setJavaScriptEnabled(true);
        engine.getSettings().setBuiltInZoomControls(true);
        engine.getSettings().setLoadsImagesAutomatically(true);
        engine.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        engine.setInitialScale(1);
    
        engine.setWebViewClient(new WebViewClient());
        
        engine.setWebChromeClient(new WebChromeClient() 
        {
              @Override
                 public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,QuotaUpdater quotaUpdater)
                 {
                       quotaUpdater.updateQuota(spaceNeeded * 2);
                 }
              public void onProgressChanged(WebView view, int progress)
              {
                  activity.setTitle("Loading...");
                  activity.setProgress(progress * 100);
    
                  if(progress == 100)
                  { 
                      activity.setTitle(R.string.app_name);
                  }
              }
           });
        
        String appCachePath;
        
        engine.getSettings().setDomStorageEnabled(true);
       // Set cache size to 8 mb by default. should be more than enough
        engine.getSettings().setAppCacheMaxSize(1024*1024*8);
        appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
        engine.getSettings().setAppCachePath(appCachePath);
        engine.getSettings().setAllowFileAccess(true);
        engine.getSettings().setAppCacheEnabled(true);
        engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    
         cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
         if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected())
         {           
             appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
             engine.getSettings().setAppCachePath(appCachePath);
             
             engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
             engine.loadUrl("http://www.google.com");
         }
         else
         {
             System.err.println("CACHE OR NETWROK");
             engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
             engine.loadUrl("http://www.google.com");
         }
    }
    

    And Permissions:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
  • Sargius
    Sargius over 10 years
    Hi, thanks! I followed your recommendations and now I don't see the "page could not be loaded error". I see a blank screen instead. But in the cache directory I see many files saved. Actually, there are some image files but I don't see them anyway ...
  • anthonycr
    anthonycr over 10 years
    @Sargius yeah, unfortunately it doesn't work on every page. Here is an answer I found regarding times it doesn't: stackoverflow.com/a/16721734/1499541
  • Sargius
    Sargius over 10 years
    ok, many thanks! It seems to me the issue is closed :) I am trying to vote up but the system tells me that I can't, since I haven't enough reputation (need 15).