Caching in Android webview

103,237

Solution 1

Don't use these:

viewer.getSettings().setAppCacheMaxSize(1024*1024*8);   
viewer.getSettings().setAppCachePath("/data/data/com.your.package.appname/cache"‌​);    
viewer.getSettings().setAppCacheEnabled(true);   

These have nothing to do with the default webview internal cache. Appcache is an entirely different feature mean to make you able to run the website w/o an internet connection. It does not work that great and probably you do not want to use it.

With setting this: viewer.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT) is enough.

Solution 2

Of course, cached approach should be faster. That's the exact reason caching is there in the first place.

But you should be fine unless you specifically disable caching for webview. If you don't - it will use cache by default.

Solution 3

    /*
        public abstract void setAppCacheEnabled (boolean flag)
            Sets whether the Application Caches API should be enabled. The default is false.
            Note that in order for the Application Caches API to be enabled, a valid database
            path must also be supplied to setAppCachePath(String).

        Parameters
            flag : true if the WebView should enable Application Caches
    */
    // Enable the caching for web view
    mWebView.getSettings().setAppCacheEnabled(true);

    /*
        public abstract void setAppCachePath (String appCachePath)
        Sets the path to the Application Caches files. In order for the Application Caches
        API to be enabled, this method must be called with a path to which the application
        can write. This method should only be called once: repeated calls are ignored.

        Parameters
            appCachePath : a String path to the directory containing Application Caches files.
    */
    /*
        public abstract File getCacheDir ()
            Returns the absolute path to the application specific cache directory on the
            filesystem. These files will be ones that get deleted first when the device runs
            low on storage. There is no guarantee when these files will be deleted.

            Note: you should not rely on the system deleting these files for you; you should
            always have a reasonable maximum, such as 1 MB, for the amount of space you consume
            with cache files, and prune those files when exceeding that space.

            The returned path may change over time if the calling app is moved to an adopted
            storage device, so only relative paths should be persisted.

            Apps require no extra permissions to read or write to the returned path,
            since this path lives in their private storage.

        Returns
            The path of the directory holding application cache files.
    */
    /*
        public String getPath ()
            Returns the path of this file.
    */
    // Specify the app cache path
    mWebView.getSettings().setAppCachePath(mContext.getCacheDir().getPath());

    /*
        public abstract void setCacheMode (int mode)
            Overrides the way the cache is used. The way the cache is used is based on the
            navigation type. For a normal page load, the cache is checked and content is
            re-validated as needed. When navigating back, content is not re-validated, instead
            the content is just retrieved from the cache. This method allows the client to
            override this behavior by specifying one of
                LOAD_DEFAULT,
                LOAD_CACHE_ELSE_NETWORK,
                LOAD_NO_CACHE or
                LOAD_CACHE_ONLY.
            The default value is LOAD_DEFAULT.

        Parameters
            mode : the mode to use
    */
    /*
        public static final int LOAD_DEFAULT
            Default cache usage mode. If the navigation type doesn't impose any specific
            behavior, use cached resources when they are available and not expired, otherwise
            load resources from the network. Use with setCacheMode(int).

        Constant Value: -1 (0xffffffff)
    */
    /*
        public static final int LOAD_CACHE_ELSE_NETWORK
            Use cached resources when they are available, even if they have expired. Otherwise
            load resources from the network. Use with setCacheMode(int).

        Constant Value: 1 (0x00000001)
    */
    /*
        public static final int LOAD_NO_CACHE
            Don't use the cache, load from the network. Use with setCacheMode(int).

        Constant Value: 2 (0x00000002)
    */
    /*
        public static final int LOAD_CACHE_ONLY
            Don't use the network, load from the cache. Use with setCacheMode(int).

        Constant Value: 3 (0x00000003)
    */
    // Set the cache mode
    mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
Share:
103,237

Related videos on Youtube

Eljas
Author by

Eljas

Updated on July 09, 2022

Comments

  • Eljas
    Eljas almost 2 years

    Which one is faster way to load mobile web pages and non mobile web pages in Android webview; loading cache or not loading that at all?

    And what is recommend style to load that?

    Right now when I don't load cache at all non mobile sites are much more slower to load than when I load them in native browser.

  • Eljas
    Eljas over 12 years
    Thank you. Is this smart style to cache or is there some problem with this? viewer.getSettings().setAppCacheMaxSize(1024*1024*8); viewer.getSettings().setAppCachePath("/data/data/com.your.pa‌​ckage.appname/cache"‌​); viewer.getSettings().setAppCacheEnabled(true); viewer.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
  • Ivan Bartsov
    Ivan Bartsov over 12 years
    Yeah, I don't see anything wrong with that (I assume you put real package name in your actual code :) ). If in doubt you can play around with size and do some tests so see which works best for the type of content you're loading. If the pages are big and you're planning to load a lot of different ones - might want a bigger cache than 1Mb. If they're mostly text and your app will only need to display a small number of them - you're probably fine with current settings.
  • jojackso
    jojackso over 12 years
    before using AppCache, look at this: code.google.com/p/android/issues/detail?id=24180
  • Ed_
    Ed_ over 10 years
    Can you back this up with a link to some documentation describing AppCache? Given that LOAD_DEFAULT has the word "default" in it, surely the last line in your answer does nothing unless you've explicitly set a different value for it somewhere else?
  • r.bhardwaj
    r.bhardwaj about 10 years
    setAppCacheMaxSize has been deprecated from api 18. developer.android.com/reference/android/webkit/…
  • Nilzor
    Nilzor about 9 years
    @ed-hinchliffe it's hard to find good documentation on this from Google itself, but they do refer to this document docs.webplatform.org/wiki/tutorials/appcache_beginner from the "Working offline" section of this post on the Google Chrome WebView: developer.chrome.com/multidevice/android/overview. Also you are correct in that his last line in the answer does nothing.
  • Rajat Sharma
    Rajat Sharma over 8 years
    developer.android.com/reference/android/webkit/… is for application cache api of html 5. It is deprecated and doesn't seem to play a role in webview cache unless implemented at the html page as well: developer.android.com/reference/android/webkit/…
  • Shailendra Madda
    Shailendra Madda about 7 years
    Yes don't hard code use this if it is a fragment: getActivity().getApplicationContext().getCacheDir().getAbsol‌​utePath()
  • Shubham AgaRwal
    Shubham AgaRwal almost 5 years
    The default value is {@link #LOAD_DEFAULT}
  • aldok
    aldok over 4 years
    Would you explain why we shouldn't use those functions? I don't find warnings on the Android documentation.
  • Girish
    Girish over 3 years
    webView.getSettings().setAppCacheEnabled(true); deprecated any alternate way to handle this?
  • B Medeiros
    B Medeiros about 3 years
    the docs point to: web.dev/appcache-removal