11

WebView に読み込まれた Web サイトをキャッシュしようとしていますが、ネットワーク接続がオフの場合は機能しません。

Cachdirectory が作成され、キャッシュされたファイルがそこにあります。許可が与えられます。WebPage をロードしてからネットワークをオフにします (WI-FI アクセス許可も与えられます)。ページをリロードしようとするとエラーが発生します (キャッシュからロードする必要があります)。助けてください!

コードは次のとおりです。

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.setWebViewClient(new WebViewClient());
    
    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);
              }
          }
       });
    
    String appCachePath;
    
    engine.getSettings().setDomStorageEnabled(true);
   // Set cache size to 8 mb by default. should be more than enough
    engine.getSettings().setAppCacheMaxSize(1024*1024*8);
    appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
    engine.getSettings().setAppCachePath(appCachePath);
    engine.getSettings().setAllowFileAccess(true);
    engine.getSettings().setAppCacheEnabled(true);
    engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

     cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
     if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected())
     {           
         appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
         engine.getSettings().setAppCachePath(appCachePath);
         
         engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
         engine.loadUrl("http://www.google.com");
     }
     else
     {
         System.err.println("CACHE OR NETWROK");
         engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
         engine.loadUrl("http://www.google.com");
     }
}

そして許可:

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

1 に答える 1

10

あなたの使用

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

WebViewにキャッシュからページをロードするように指示していますが、キャッシュにないものが必要な場合はネットワークを調べ、接続がない場合は「ページをロードできませんでした」というエラーが表示されます." これは、残念ながらすべてがキャッシュに保存されるわけではないためです。この設定を使用しても、ブラウザがネットワークを使用していることがわかります。

接続を無視する WebView を取得する唯一の方法は、

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);

代わりに設定します。一部の画像はこの設定では読み込まれませんが (キャッシュされていないため)、キャッシュ内にあるものはすべて読み込まれます。


あなたの質問に関係のないもう 1 つの注意点は、コードで setAppCacheMaxSize が使用されており、WebView がキャッシュ サイズ自体を管理するため、API 18 以降では非推奨になっていることです。

于 2013-11-08T17:56:15.720 に答える