1. ホーム
  2. android

[解決済み] Android Webview - キャッシュを完全に削除する

2022-07-07 03:50:52

質問

アクティビティにWebViewがあり、それがWebページをロードするとき、そのページはFacebookからいくつかの背景データを収集します。

しかし、私が見ているのは、アプリケーションに表示されるページが、アプリが開かれ更新されるたびに同じであるということです。

WebViewがキャッシュを使用しないように設定したり、WebViewのキャッシュと履歴を消去してみたりしています。

こちらの提案にも従いました。 WebViewのキャッシュを空にする方法は?

しかし、このどれも動作しません。誰か、私のアプリケーションの重要な部分であるため、この問題を克服することができる任意のアイデアを持っていますか。

    mWebView.setWebChromeClient(new WebChromeClient()
    {
           public void onProgressChanged(WebView view, int progress)
           {
               if(progress >= 100)
               {
                   mProgressBar.setVisibility(ProgressBar.INVISIBLE);
               }
               else
               {
                   mProgressBar.setVisibility(ProgressBar.VISIBLE);
               }
           }
    });
    mWebView.setWebViewClient(new SignInFBWebViewClient(mUIHandler));
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.clearHistory();
    mWebView.clearFormData();
    mWebView.clearCache(true);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    Time time = new Time();
    time.setToNow();

    mWebView.loadUrl(mSocialProxy.getSignInURL()+"?time="+time.format("%Y%m%d%H%M%S"));

というわけで、最初の提案を実装してみました(再帰的なコードに変更しましたが)。

private void clearApplicationCache() {
    File dir = getCacheDir();

    if (dir != null && dir.isDirectory()) {
        try {
            ArrayList<File> stack = new ArrayList<File>();

            // Initialise the list
            File[] children = dir.listFiles();
            for (File child : children) {
                stack.add(child);
            }

            while (stack.size() > 0) {
                Log.v(TAG, LOG_START + "Clearing the stack - " + stack.size());
                File f = stack.get(stack.size() - 1);
                if (f.isDirectory() == true) {
                    boolean empty = f.delete();

                    if (empty == false) {
                        File[] files = f.listFiles();
                        if (files.length != 0) {
                            for (File tmp : files) {
                                stack.add(tmp);
                            }
                        }
                    } else {
                        stack.remove(stack.size() - 1);
                    }
                } else {
                    f.delete();
                    stack.remove(stack.size() - 1);
                }
            }
        } catch (Exception e) {
            Log.e(TAG, LOG_START + "Failed to clean the cache");
        }
    }
}

しかし、これはまだページが表示しているものを変更していません。デスクトップ ブラウザでは、WebView で生成された Web ページとは異なる html コードが表示されるため、WebView がどこかにキャッシュされている必要があることがわかります。

IRCチャンネルで、URL接続からキャッシュを削除するための修正を指摘されましたが、WebViewにそれを適用する方法はまだ見当たりません。

http://www.androidsnippets.org/snippets/45/

アプリケーションを削除して再インストールすると、ウェブページを最新の状態、つまりキャッシュされていないバージョンに戻すことができます。主な問題は、変更が Web ページ内のリンクに行われるため、Web ページのフロント エンドが完全に変更されないことです。

どのように解決するのですか?

Gaunt Face さんによって投稿された上記の編集コードには、ディレクトリのファイルが削除できないために削除に失敗した場合、コードが無限ループで再試行し続けるというエラーが含まれています。私はこれを本当に再帰的になるように書き直し、numDays パラメータを追加して、剪定されるファイルが何歳でなければならないかを制御できるようにしました。

//helper method for clearCache() , recursive
//returns number of deleted files
static int clearCacheFolder(final File dir, final int numDays) {

    int deletedFiles = 0;
    if (dir!= null && dir.isDirectory()) {
        try {
            for (File child:dir.listFiles()) {

                //first delete subdirectories recursively
                if (child.isDirectory()) {
                    deletedFiles += clearCacheFolder(child, numDays);
                }

                //then delete the files and subdirectories in this dir
                //only empty directories can be deleted, so subdirs have been done first
                if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) {
                    if (child.delete()) {
                        deletedFiles++;
                    }
                }
            }
        }
        catch(Exception e) {
            Log.e(TAG, String.format("Failed to clean the cache, error %s", e.getMessage()));
        }
    }
    return deletedFiles;
}

/*
 * Delete the files older than numDays days from the application cache
 * 0 means all files.
 */
public static void clearCache(final Context context, final int numDays) {
    Log.i(TAG, String.format("Starting cache prune, deleting files older than %d days", numDays));
    int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays);
    Log.i(TAG, String.format("Cache pruning completed, %d files deleted", numDeletedFiles));
}

他の人の役に立つといいのですが :)