14

私は、Androidベースの電話でも実行できるWebベースのアプリケーションを開発しています。持っていないので、SDKのエミュレーターをうまく使用しています。

しかし、アプリケーションの一部のJavaScriptページを絶えず変更しているため、ブラウザーはキャッシュから古いバージョンを使用します(サーバーのキャッシュ制御は正しいですが、過度のキャッシュが必要な通常のユースケースはありません)

それで、(デフォルトの)Androidブラウザにキャッシュを永久に無効にするように指示する方法はありますか?
または、adbコマンドを使用してキャッシュをクリアすることは可能ですか?

4

6 に答える 6

12

デバッグ中は、メタ タグをページに追加してキャッシュを無効にします。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

http://www.i18nguy.com/markup/metatags.html

于 2011-06-27T02:09:02.727 に答える
8

adbコマンドを使用すると、ブラウザのキャッシュとユーザーデータをクリアできます

adb shell pm clear com.android.browser

ただし、Androidプログラムランタイムからこれを発行した場合、これは機能しません

それに関する私の前の質問を参照してください

これは一時的な解決策ですが、バックグラウンド実行サービスを使用してAndroidブラウザーのキャッシュを継続的にクリアする必要がある場合は、「android.content.pm.IPackageDataObserver」を使用して実行できます。

import java.util.List;

import android.app.PendingIntent;
import android.app.Service;    
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.os.Handler;
import android.os.IBinder;


public class CacheCleanerService extends Service {

public static final String REFRESH_INTENT="tritop.android.slwcachecleanerwidget.REFRESH";
public static final String CLEAR_INTENT="tritop.android.slwcachecleanerwidget.CLEAR";
public static final long RECOUNTNDELAY=1500;
private boolean mDND=false;
private Handler mHandler;
private int statsCounter;
private long mCacheSum;
private StatsObserver mStatsObs;
private ClearCacheObserver mClearObs;
private PackageManager mPM;
private List<PackageInfo> mInstPkg;


private Runnable mTriggerCount = new Runnable()
{

    public void run()
    {
     countCache();
    }
 };

 private Runnable mAutoKill = new Runnable()
    {

        public void run()
        {
         stopSelf();
        }
     };


//More info in ApplicationState.java @ android.git.kernel.org
class StatsObserver extends IPackageStatsObserver.Stub{
    public void onGetStatsCompleted(PackageStats stats,boolean bl){
        mCacheSum+=stats.cacheSize;
        statsCounter++;
        if(statsCounter>=mInstPkg.size()){
            updateWidgets();
        }
    }
}

class ClearCacheObserver extends IPackageDataObserver.Stub {
    public void onRemoveCompleted(final String packageName, final boolean succeeded) {
     }
 }

private void countCache() {
    statsCounter = 0;
    mCacheSum = 0;
    mInstPkg= mPM.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES |
               PackageManager.GET_DISABLED_COMPONENTS);
    for(PackageInfo pInfo: mInstPkg){
         //  mPM.getPackageSizeInfo(pInfo.packageName, mStatsObs);
    }
}

private void clearCache(){
    mInstPkg= mPM.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES |
               PackageManager.GET_DISABLED_COMPONENTS);
    //mPM.freeStorageAndNotify(Integer.MAX_VALUE, mClearObs);
    //mPM.freeStorageAndNotify(Long.MAX_VALUE, mClearObs);
    mHandler.postDelayed(mTriggerCount, RECOUNTNDELAY);
}



@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public void onCreate() {
    mStatsObs = new StatsObserver();
    mClearObs = new ClearCacheObserver();
    mPM = getPackageManager();
    mHandler = new Handler();
}

@Override
public void onDestroy() {
    mHandler.removeCallbacks(mAutoKill);
    mHandler.removeCallbacks(mTriggerCount);
    mDND=false;
    super.onDestroy();
}

@Override
public void onStart(Intent intent, int startId) {
    if(!mDND){
        mHandler.postDelayed(mAutoKill, 20000);
        mDND=true;
        mCacheSum=0;
        statsCounter=0;
        if(CLEAR_INTENT.equals(intent.getAction())){
            clearCache();
        }
        else{
            countCache();
        }
    }
}

}

于 2012-06-15T06:24:47.397 に答える
3

各呼び出しのクエリ パラメータとして時間 (長い、エポック形式からのミリ秒) を追加してみてください。これにより、キャッシュされたコピーが使用されなくなります。通常の J2EE/Struts/Tomcat スタックでこれを行い、すべての (デスクトップ) ブラウザーでうまく動作します。

本番環境でキャッシュされた動作が必要な場合は、余分なパラメーターを簡単に削除できます。

于 2011-06-07T17:13:50.640 に答える
2

キャッシュマニフェストを使用しないのはなぜですか?

https://developer.mozilla.org/en/Offline_resources_in_Firefox

jsファイルをネットワークセクションに配置すると、必要な処理が実行されます。

キャッシュマニフェストファイルのNETWORK:セクションヘッダーの下にリストされているファイルは、サーバーへの接続を必要とするホワイトリストに登録されたリソースです。ユーザーがオフラインの場合でも、このようなリソースへのすべてのリクエストはキャッシュをバイパスします。ワイルドカードを使用できます。

于 2012-06-20T17:08:12.750 に答える
0

多くのAJAXを使用し、エミュレーターブラウザーを常に更新する同様の問題に遭遇しました。これらの2つの方法は私を助けました。

AJAX - リクエスト ヘッダーを設定して、リクエストの if-modified-since を取得します。

 xhReq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");

または jquery $.ajax() で

beforeSend: function(xhr) {
    xhReq.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");
}

PHP を使用している場合は、ヘッダー情報を設定します。

header("Expires: Sat, 1 Jan 2005 00:00:00 GMT");
header("Last-Modified: ".gmdate( "D, d M Y H:i:s")."GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");

ソース: http://ajaxpatterns.org/XMLHttpRequest_Call

于 2012-06-18T20:15:34.773 に答える
0

私は Android エミュレーターを使用しており、ブラウザーを開いてメニューをクリックすることで、組み込みのブラウザーをクリアすることができました。そこで、[設定] を選択し、[プライバシーとセキュリティ] を選択しました。これにより、キャッシュのクリアをクリックするオプションが提供されました。

于 2013-05-03T10:54:42.270 に答える