1

i am following this question from stack overflow for my query. the code works fine but when in offline mode it does not load any page , instead it shows no internet connection.

i am doubtful if the webpage is really being written to the cache.

my code is below-

private void openURL() {
    webView.getSettings().setAppCacheMaxSize(5 * 1024 * 1024); // 5MB
    webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath());
    webView.getSettings().setAllowFileAccess(true);
    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

    if (!isNetworkAvailable()) {
        webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        Toast.makeText(MainActivity.this, "server offline. loading the cached website", Toast.LENGTH_LONG).show();
    }

    webView.loadUrl("http://www.google.com");
    webView.requestFocus();
}

the toast i am displaying is displayed in no internet condition . so the code is working fine but the page is not being loaded.

logcat

W/chromium: [WARNING:aw_network_delegate.cc(75)]    http://192.168.1.210/trackme/user/sendpagestest#-102#1
[INFO:browser_view_renderer.cc(185)] [CalculateDesiredMemoryPolicy]   [58982400][180]
register, handle(0xb8d834b0) (w:720 h:1280 s:720 f:0x1 u:0x000f02)
cache file failed CRC check
[INFO:CONSOLE(12)] "Not allowed to load local resource:    file:///android_asset/webkit/android-weberror.png", source:   data:text/html,chromewebdata (12)
[getaddrinfo]: hostname=192.168.1.210; servname=(null); cache_mode=(null), netid=0; mark=0
[getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
[INFO:SkUtilsArm.cpp(179)] Device supports ARM NEON instructions!
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
D/OpenGLRenderer: Flushing caches (mode 0)
D/OpenGLRenderer: Flushing caches (mode 0)
D/GraphicBuffer: unregister, handle(0xb8d63a28) (w:583 h:88 s:592  f:0x1 u:0x000f02)
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
E/SelfBrailleClient: Failed to bind to service
D/WebView: loadUrl=http://192.168.1.210/trackme/user/sendpagestest
W/chromium: [WARNING:aw_network_delegate.cc(75)] http://192.168.1.210/trackme/user/sendpagestest#-102#1
I/chromium: [INFO:CONSOLE(12)] "Not allowed to load local resource: file:///android_asset/webkit/android-weberror.png", source: data:text/html,chromewebdata (12)
D/libc-netbsd: [getaddrinfo]: hostname=192.168.1.210; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd: [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0

please help me.

thank you

update

i just now checked for google.com and it works fine. but when i do it with facebook.com then the same problem appears.

Community
  • 1
  • 1
Sagar Nayak
  • 2,138
  • 2
  • 19
  • 52
  • Your LogCat showed that webview load `http://192.168.1.210/trackme/user/sendpagestest` and said 'cache file failed CRC check`. Can you show its HTML source. Maybe there's something in the page that prevent webview from caching it. – Zamrony P. Juhara Feb 25 '16 at 07:35
  • thanks for the response . but i dint get you. what do you want to see. the webpage html or what ? – Sagar Nayak Feb 25 '16 at 07:39
  • either WebView cannot read/write cache file, perhaps because of incorrect permission or may be your web server some how never replied with HTTP 304. – Zamrony P. Juhara Feb 25 '16 at 07:42
  • cant i explicitly make the response as 304. – Sagar Nayak Feb 25 '16 at 07:51

2 Answers2

1

As far as I know, WebView loads from cache if web server replies with HTTP 304 (not modified). It still require to send HTTP GET to web server and that requires network connection.

Community
  • 1
  • 1
Zamrony P. Juhara
  • 5,222
  • 2
  • 24
  • 40
0

after doing some research i found answer to my question.

i explicitly downloaded the webpage into the device and save it. and when the device is in offline mode i display the webpage saved in the device. and when it is online the page is again downloaded and override the previous one.

i used the following code-

to download

InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
       URL url = new URL("http://192.168.1.210/bibhutest.html");
       connection = (HttpURLConnection) url.openConnection();
       connection.connect();
            int fileLength = connection.getContentLength();
            input = connection.getInputStream();
            output = new FileOutputStream("address at which you want to download file");
            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                output.write(data, 0, count);
            }
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            if (connection != null)
                connection.disconnect();

to show the downloaded file

if (!isNetworkAvailable()) {
// from the device when dont have internet
webView.loadUrl("file:////sdcard/android/data/downloads.html");
webView.requestFocus();
}

if (!isNetworkAvailable()) {
//load directly from the internet
webView.loadUrl(url);
webView.requestFocus();
}

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

use the above code according to your own need and tweak it when to download the file and save the file and how to display. apply the appropriate logic in your code.

thank you

Sagar Nayak
  • 2,138
  • 2
  • 19
  • 52