2011-08-22 75 views
3

我有这个应用程序,它使用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/"); 
      } 











    } 
} 

回答

1

也许NetworkInfo对象为null,您将得到一个NullPointerException。找出代码行的最好方法是使用logcat并查看堆栈跟踪。

顺便说一句,我用类似的方式在网页视图,但与我的设备(欲望+ CM7),这是行不通的,因为从来没有使用的高速缓存使用缓存..

随着亲切的问候, jayearn

1
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; 
1

在AndroidManifest.xml中只需添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 。它会像魔术一样工作。 LogCat帮助。

0

你还需要检查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()); 

这将保证缓存将在应用程序卸载时被删除