0

私は、(少なくとも) 一部が Web アプリであり、ネイティブ アプリを装ったネイティブ アプリを構築しています。Facebook は適切なキャッシュを使用することがいかに重要かを示しましたが、私は Web ページをキャッシュしているので、2 回目にロードしたときにアプリのネイティブ部分のように感じられます。ただし、私が設定した方法では、キャッシュされたコンテンツは永続的です。そのため、サーバーで何かを変更しても、キャッシュされた古いコンテンツが引き続き表示されます。

これが私が達成したいことであり、1が最も望ましいものです。

  1. EITHER キャッシュされたコンテンツが最初に表示されます。バックグラウンドで、ページは新しいバージョンをチェックしますが、コンテンツが異なる場合にのみリロードします。
  2. またはキャッシュされたコンテンツが最初に表示されます。バックグラウンドでページが更新され、再読み込みされます。
  3. または、キャッシュされたコンテンツが X 時間 (1 週間?) 後に消去され、ページが強制的にリロードされます。

最後のオプションは、ページがリロードされるたびに遅くてひどい感じがするため、最も好ましくありません。2 番目のオプションは、私のネイティブ アクティビティの動作です (最初にキャッシュを表示し、バックグラウンドで更新します。ただし、その間にユーザーが下にスクロールした場合、これによりユーザーがリストの一番上にジャンプします)。最初は絶対に完璧です!

これが私が現在使用しているコードです。

WebView wv = (WebView) v.findViewById(ref_id);
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setDatabaseEnabled(true);
String appDBPath = v.getContext().getApplicationContext().getDatabasePath("AppConstructor").getAbsolutePath();

    wv.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onReachedMaxAppCacheSize(long spaceNeeded,
                long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
            quotaUpdater.updateQuota(spaceNeeded * 2);
        }

        @Override
        public void onExceededDatabaseQuota(String url,
                String databaseIdentifier, long currentQuota,
                long estimatedSize, long totalUsedQuota,
                WebStorage.QuotaUpdater quotaUpdater) {
            quotaUpdater.updateQuota(estimatedSize * 2);
        }
    });

wv.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
wv.getSettings().setDomStorageEnabled(true);
wv.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);
String appCachePath = v.getContext().getApplicationContext().getCacheDir().getAbsolutePath();
wv.getSettings().setAppCachePath(appCachePath);
wv.getSettings().setAllowFileAccess(true);
wv.getSettings().setAppCacheEnabled(true);
wv.loadUrl(ref_arg1);
Core x = new Core();
wv.addJavascriptInterface(x.new JavaScriptInterface(v.getContext()),"Android");

どんな助けでも大歓迎です!

4

1 に答える 1

4

OK、年齢を検索し、StackOverflow でタンブルウィードの実績を取得した後、状況 1 を取得する方法を次に示します。

WebViewがキャッシュをロードした後、新しいASyncTask. この ASyncTask は、独自のカスタム最終更新変数である URL に何かを追加します。もちろん、これを に置き換えることもできますがHTTP Header Last-Update、それは私にとってはうまくいきませんでした。結果の変数がキャッシュされた変数 (私は に保存したものSharedPreferences) と異なる場合、ASyncTask は次のコードを使用して WebView のキャッシュを強制的に更新します。

_wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
_wv.reload();
于 2012-11-13T14:16:47.860 に答える