Ответ 1
В течение отладки добавьте метатег на свою страницу, чтобы отключить кеширование.
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
Я разрабатываю веб-приложение, которое также должно работать на телефонах на базе Android. Поскольку у меня его нет, я успешно использую эмулятор из SDK.
Но по мере того, как я постоянно меняю некоторые страницы JavaScript приложения, браузер использует старые версии из кеша (контроль кеша на сервере прав - но у меня нет нормального использования, когда чрезмерное кэширование хотел)
Итак, есть способ рассказать (по умолчанию) Android-браузер для окончательного отключения кеша?
Или можно использовать команду adb
для очистки кеша?
В течение отладки добавьте метатег на свою страницу, чтобы отключить кеширование.
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
Используя команду 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();
}
}
}
}
Попробуйте добавить время (в формате long, ms from epoch format) в качестве параметра запроса для каждого вызова. Это предотвратит использование кешированной копии. Мы делаем это в нашем обычном стеке J2EE/Struts/Tomcat, и он хорошо работает со всеми (настольными) браузерами.
Если вы хотите, чтобы кэшированное поведение в процессе производства легко удаляло дополнительные параметры.
Почему вы не используете манифест кэша?
https://developer.mozilla.org/en/Offline_resources_in_Firefox
Если вы поместите свои js файлы в сетевой раздел, это должно сделать то, что вам нужно:
Файлы, перечисленные в заголовке раздела NETWORK: в файле манифеста кэша, являются ресурсами с белым списком, для которых требуется подключение к серверу. Все запросы к таким ресурсам обходят кеш, даже если пользователь отключен. Могут использоваться подстановочные знаки.
Я столкнулся с подобной проблемой, используя большое количество AJAX и постоянно обновляя браузер эмулятора. Эти два метода помогли мне.
AJAX - установите заголовок запроса, чтобы получить reqeust 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");
Я использую эмулятор Android и смог очистить встроенный браузер, открыв браузер и нажав на меню. Там я выбрал "Настройки", а затем "Конфиденциальность и безопасность". Это дало возможность нажать кнопку Очистить кеш.