2011-03-06 6 views
14

저는 Android 기반 휴대 전화에서도 실행해야하는 웹 기반 응용 프로그램을 개발 중입니다. SDK가 없으므로 SDK에서 에뮬레이터를 성공적으로 사용하고 있습니다.Android 브라우저 캐시를 영구적으로 사용 중지하는 방법은 무엇인가요?

하지만 애플리케이션의 일부 JavaScript 페이지가 계속 변경되어 브라우저가 캐시의 이전 버전을 사용합니다 (서버의 캐시 제어가 올바르지 만 과도한 캐싱이있는 일반적인 사용 사례가 없습니다.)가 필요합니다.

(기본값) 안드로이드 브라우저가 캐시를 영구적으로 비활성화하도록 알려줄 수있는 방법이 있습니까?
또는 adb 명령을 사용하여 캐시를 지울 수 있습니까?

+2

이것은 제 문제이기도합니다. – Neutralizer

답변

3

각 통화의 쿼리 매개 변수로 시간 (긴 시간, 에포크 형식 이후의 시간)을 추가해보십시오. 이렇게하면 캐시 된 사본이 사용되지 않습니다. 우리는 일반적인 J2EE/Struts/Tomcat 스택에서 이것을 수행하며 모든 데스크탑 (데스크탑) 브라우저에서 잘 작동합니다.

프로덕션 환경에서 캐싱 된 동작을 사용하면 추가 매개 변수를 쉽게 제거 할 수 있습니다.

+0

그게 해결할 수있는 방법입니다 -하지만 슬프게도 해결책은 아닙니다 ... – Chris

+1

사용자/브라우저가 캐시하기로 결정했는지 여부는 웹 앱 작성자로서 귀하의 통제하에 있지 않습니다. AFAIK는 진정한 해결책이없는 문제에 대한 유일한 입증 된 해결 방법입니다. – Pedantic

+1

어쨌든 WebView의 WebSettings에는 도움이 될'setCacheMode (..)'함수가 있습니다. – Pedantic

12

디버깅하는 동안 캐싱을 사용하지 않으려면 메타 태그를 페이지에 추가하십시오.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> 
는 브라우저 캐시 및 사용자 데이터

adb shell pm clear com.android.browser 

을 취소 할 수 있습니다 ADB 명령을 사용하여

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

+0

이 장치는 모든 장치에서 작동하지 않습니다. 어떤 사람들은 그것을 무시하고있다. –

8

하지만

표시되는 안드로이드 프로그램 런타임에서이를 발행하는 경우이 작동하지 않습니다 내 이전에 question에 관해서

브라우저 캐시를 백그라운드에서 실행하는 서비스를 사용하여 브라우저 캐시를 지속적으로 지워야하는 경우 일시적인 해결 방법이지만 "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 - 요청 헤더가 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

이 왜 캐시 매니페스트를 사용하지 않는?네트워크 섹션에서 JS 파일을 넣으면

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

, 이것은 당신이 무엇을해야한다 : 네트워크 아래에 나열

파일 : 캐시 매니페스트 파일의 섹션 헤더는 흰색 나와 있습니다 서버에 연결해야하는 자원 이러한 자원에 대한 모든 요청은 사용자가 오프라인 인 경우에도 캐시를 우회합니다. 와일드 카드를 사용할 수 있습니다.

0

Android 에뮬레이터를 사용하고 있으며 브라우저를 열고 메뉴를 클릭하여 내장 브라우저를 지울 수있었습니다. 거기에서 설정과 "개인 정보 및 보안"을 차례로 선택했습니다. 이렇게하면 캐시 지우기 옵션을 선택할 수 있습니다.

관련 문제