[解決済み] Android Webview - キャッシュを完全に削除する
質問
アクティビティに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));
}
他の人の役に立つといいのですが :)
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] ウェブサイト制作のためのChromeキャッシュの無効化
-
[解決済み】「px」、「dip」、「dp」、「sp」の違いは?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
-
[解決済み] AndroidでNode.Jsを動作させる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] メディアプレーヤーが状態0で呼び出され、エラー(-38,0)
-
[解決済み] カスタムレイアウトとEditTextを持つAlertDialog.Builderは、ビューにアクセスすることができません。
-
[解決済み] Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
-
[解決済み] 確認(yes/no)用のDialogPreferenceを実装するには?
-
[解決済み] Fragment ActionBarCompatの内部からgetSupportActionBarを取得する。
-
[解決済み] RelativeLayoutレイアウトパラメータをxmlではなくコードで設定するには?
-
[解決済み] Android Studio 1.0とエラー "Library projects cannot set applicationId "について
-
[解決済み] Androidでユーザーの非アクティブを検出する方法
-
[解決済み] Android端末のシリアルナンバーを調べるには?