2011-03-06 90 views
14

我正在开发基于Web的应用程序,该应用程序也应该在基于Android的手机上运行。 由于我没有我成功使用SDK中的模拟器。如何永久禁用Android浏览器缓存?

但正如我在不断变化的浏览器使用的旧版本了它的应用的一些JavaScript网页的The服务器上的高速缓存(缓存控制是正确的 - 但我没有在那里的正常使用情况下过多的缓存是想通过)

那么有没有办法告诉(默认)Android浏览器永久禁用它的缓存?
或者是否可以使用adb命令清除缓存?

+2

这也是我的问题。 – Neutralizer 2011-06-03 13:06:13

回答

3

尝试追加每个呼叫的查询参数的时间(长整型,自epoch格式以来的ms)。这会阻止正在使用的缓存副本。我们在常规的J2EE/Struts/Tomcat堆栈中执行此操作,并且它适用于所有(桌面)浏览器。

如果你想在生产中缓存行为,很容易删除额外的参数。

+0

这是一种解决方法,可以工作 - 但它可悲的不是一个解决方案... – Chris 2011-06-09 20:35:19

+1

用户/浏览器是否决定缓存不受你作为一个Web应用程序作者的控制。 AFAIK是唯一一个经过实践验证的解决方案,解决了没有真正解决方案的问题。 – Pedantic 2011-06-10 02:18:48

+1

无论如何,WebView的WebSettings有一个'setCacheMode(..)'函数可以帮助你。 – Pedantic 2011-06-10 05:15:24

12

在调试期间,向页面添加元标记以禁用缓存。

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

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

+0

这不会在每个设备上工作。有些人只是无视它 – 2014-12-15 10:35:43

8

使用ADB命令可以清除浏览器缓存和用户数据

adb shell pm clear com.android.browser 

,但如果你从Android程序运行

看到发出此这是不行的我前面question关于那

虽然这是临时解决方案,如果你需要清除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(); 
     } 
    } 
} 

}

0

我使用大量AJAX的不断刷新模拟器浏览器遇到了类似的问题。这两种方法对我有帮助。

AJAX - 设置请求标头以获取reqeust if-modified-since。

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

或者使用jQuery $就()

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

2

你为什么不使用缓存清单?

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

如果你把你的JS文件在网络部分,这应该做你需要的东西:

文件的网络中列出:在缓存清单文件节头是白名单需要连接到服务器的资源。即使用户处于离线状态,对这些资源的所有请求都会绕过缓存。可以使用通配符。

0

我正在使用Android模拟器,并能够通过打开浏览器并单击菜单来清除内置浏览器。在那里我选择了设置,然后选择了“隐私和安全”。这给了点击清除缓存的选项。