开发者

Load Cache in Android Webview when not connected to internet else show the content from the server when connected to internet

I have this app which uses webview to render the cached content when it is in offline mode and shows the webpage from the server when connected to internet...

The code snippets are shown below. It crashes when i run the app.

I am not able to figure it out what is going wrong. i have also set the uses-permission android:name="android.permission.INTERNET" in manifest file.

package com.html5webappcache.android;

import android.app.Activity;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage.QuotaUpdater;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;

public class HTML5WebAppCacheTestActivity extends Activity {
    final Activity activity = this;
    private ConnectivityManager cm;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Adds Progrss bar Support
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.main );

        getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); 

        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.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);

                  }
              }
           });
        engine.getSettings().setDomStorageEnabled(true);
       // Set cache size to 8 mb by default. should be more than enough
        engine.getSettings().setAppCacheMaxSize(1024*1024*开发者_C百科8);
        engine.getSettings().setAppCachePath("/data/data/com.html5webappcache.android/cache");
        engine.getSettings().setAllowFileAccess(true);
        engine.getSettings().setAppCacheEnabled(true);
        engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

         cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
         if(cm.getActiveNetworkInfo().isConnected())
         {
         engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
         engine.loadUrl("http://www.bifter.co.uk/");
         }
             else{
                engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
                 engine.loadUrl("http://www.bifter.co.uk/");
             }











    }
}


maybe the NetworkInfo object is null and you get a NullPointerException. The best way to find out the code line is, to use logcat and view the stacktrace.

By the way, I use a similar way to use caching in WebViews but with my device (Desire + CM7) it doesn't work since the cache is never used..

With kind regards, jayearn


webview1 = (WebView) findViewById(R.id.webView1);

    WebSettings webSettings = webview1.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setCacheMode(WebSettings.LOAD_NORMAL); <--- CHANGE THIS
    webSettings.setAppCacheMaxSize(1024*1024*8);
    webview1.addJavascriptInterface(new JavaScriptInterface(this),
            "Android");
    webview1.setWebViewClient(new MyWebViewClient());
    webview1.setBackgroundColor(Color.BLACK);


    try {
        current_url = "http://........link";
        webview1.loadUrl(current_url);
    } catch (Exception e) {
        Log.v("Loading Webview Failed", "Loading the webview Failed");
    }

    current_fact = 0;


Just add <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> in AndroidManifest.xml. It will work like magic. LogCat helped.


you also need to check the networkInfo for null so basically your if statement should be

if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected()){
//load cache
}else{
//load default
}

Don't forget to add these permissions

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

As for the AppCachePath, if you are building for android 2.2+ then use this instead

engine.getSettings().setAppCachePath(getApplication().getCacheDir().toString());

This will guarantee that the Cache will be deleted on app uninstall

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜