2

Android アプリで WebView を使用していますが、WebView がキャッシュされないようにする必要があります。

残念ながら、この一見単純な目標を達成するのはほとんど不可能に思えます。私が使用した解決策は、onPageFinished イベントで webview.clearCache(true) を実行して、ページが読み込まれるたびにキャッシュがクリアされるようにすることです。いくつか問題があります...

キャッシュが大きくなるにつれて、clearCache メソッドの実行に非常に時間がかかることに気付きました。clearCache を実行してから、別の Web ビューを含む別のアクティビティに切り替えると、前の clearCache 操作の完了をまだ待っているため、その Web ビューが数秒間読み込まれないことがあります。

さらに悪いことに、キャッシュが既にクリアされた後、その後の clearCache の呼び出しの実行時間は減少していないようです。clearCache の呼び出しが完了するまでに 3 秒かかり、すぐにもう一度 clearCache を呼び出した場合、clearCache の 2 回目の呼び出しはほとんどすぐに完了すると予想されます。しかし、それは私が経験していることではありません。clearCache への 2 回目の呼び出しには、まだ約 3 秒かかります。

他の誰かがこれを経験しましたか?パフォーマンスを向上させる方法はありますか? WebView が (ローカル ファイルシステムから) 読み込まれるまで 2 ~ 3 秒待つのは恐ろしいことです。

編集:

これが、実際にキャッシュをクリアするための最良の代替手段です。多かれ少なかれ機能しますが、不安定で、100% 満足しているわけではありません (Mono c# で記述):

public class NoCacheWebClient : WebViewClient
{
    string previous;

    public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
    {
        base.OnPageStarted(view, url, favicon);

        if (!string.Equals(previous, url))
        {
            previous = url;
            view.Reload(); //re-load once to ignore cache
        }
        else
        {
            previous = null;
        }
    }
}
4

2 に答える 2

7

1) setAppCacheEnabledsetAppCacheMaxSizeを使用して、キャッシュ サイズをごくわずかに制限してみてください。キャッシュ サイズを小さくすると、クリーンアップが速くなります。

元:wv.getSettings().setAppCacheMaxSize(1);

また

2) キャッシュされたデータが必要ない場合は、単にsetCacheMode(WebSettings.LOAD_NO_CACHE);を設定します。、これは 、データがキャッシュされていても、「キャッシュを使用せず、ネットワークからロードする」ことを意味します。

つまり、キャッシュされたデータを無視するだけで、Android が処理します。

また

3)キャッシュなしで以下のコードを試すこともできます。

注: これは Android API 8 以降でのみ使用できます。

    Map<String, String> noCacheHeaders = new HashMap<String, String>(2);
    noCacheHeaders.put("Pragma", "no-cache");
    noCacheHeaders.put("Cache-Control", "no-cache");
    view.loadUrl(url, noCacheHeaders);

また

4) ページの読み込みが完了するたびにキャッシュをクリアします。でこんな感じWebViewClient

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    view.clearCache(true);
}

また

5) キャッシュされたデータベース全体を一度に削除してみてください。

    context.deleteDatabase("webview.db");
    context.deleteDatabase("webviewCache.db");

これにより、結果が少し速くなる可能性があります。

于 2013-01-18T05:37:16.123 に答える
1

次のアクティビティに行くときは、前のアクティビティを終了してください。そのアクティビティによって占有されていたすべてのメモリを解放できるようにします。お役に立てれば。

于 2013-01-18T04:59:02.410 に答える