在未连接到互联网的情况下在Android Web视图中加载缓存否则在连接到互联网时显示服务器的内容
问题描述:
我有这个应用程序,它使用webview在脱机模式下呈现缓存内容并显示服务器的网页连接到互联网...在未连接到互联网的情况下在Android Web视图中加载缓存否则在连接到互联网时显示服务器的内容
代码片段如下所示。它在我运行应用程序时崩溃。
我无法弄清楚哪里出了问题。我还在清单文件中设置了使用权限android:name =“android.permission.INTERNET”。
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*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/");
}
}
}
答
也许NetworkInfo对象为null,您将得到一个NullPointerException。找出代码行的最好方法是使用logcat并查看堆栈跟踪。
顺便说一句,我用类似的方式在网页视图,但与我的设备(欲望+ CM7),这是行不通的,因为从来没有使用的高速缓存使用缓存..
随着亲切的问候, 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;
答
在AndroidManifest.xml中只需添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
。它会像魔术一样工作。 LogCat帮助。
答
你还需要检查NETWORKINFO为空 所以基本上你的if语句应该是
if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected()){
//load cache
}else{
//load default
}
不要忘了添加这些权限
<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"/>
至于AppCachePath,如果你正在为Android 2.2+建设,然后用此代替
engine.getSettings().setAppCachePath(getApplication().getCacheDir().toString());
这将保证缓存将在应用程序卸载时被删除