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
精彩评论