2011-03-06 20 views
14

Android tabanlı telefonlarda da çalışması gereken web tabanlı bir uygulama geliştiriyorum. Hiç sahip olmadığımdan, SDK'dan öykünücüyü başarıyla kullanıyorum.Android tarayıcı önbelleği kalıcı olarak nasıl devre dışı bırakılır?

Ancak, uygulamanın bazı JavaScript sayfalarını sürekli olarak değiştirdiğimde, tarayıcı eski sürümlerini önbellekten kurtarır (sunucudaki önbellek denetimi doğrudur - ancak fazla önbelleğe alma işleminin söz konusu olduğu normal kullanım durumunda değilim istenir)

Yani (varsayılan) Android Browser'ın önbelleğini kalıcı olarak devre dışı bırakmasını söyleyebilmenin bir yolu var mı?
Veya önbelleği temizlemek için adb komutunu kullanmak mümkün mü?

+2

Bu benim de sorunum. – Neutralizer

cevap

3

Her arama için bir sorgu parametresi olarak saati (çogunlukla msn biçiminden itibaren) eklemeye çalışın. Bu, önbelleğe alınan kopyanın kullanılmasını engeller. Bunu normal J2EE/Struts/Tomcat yığınımızda yapıyoruz ve tüm (masaüstü) tarayıcılarda iyi çalışıyor.

Üretimde önbelleğe alınmış davranışlar istiyorsanız, ekstra paramları çıkarmanız kolaydır.

+0

Bu işe yarayacak bir çözümdür - ama ne yazık ki bir çözüm değildir ... – Chris

+1

Kullanıcı/tarayıcının önbelleklemeye karar verip vermediği web uygulaması yazarı olarak sizin kontrolünüz altında değildir. AFAIK, gerçek bir çözümü olmayan bir soruna yönelik tek ve gerçek bir çözümdür. – Pedantic

+1

Herhangi bir hızda, WebView WebSettings'in size yardımcı olabilecek bir “setCacheMode (..)” işlevi vardır. – Pedantic

12

Hata ayıklama süresi boyunca, önbelleğe almayı devre dışı bırakmak için sayfanıza bir meta etiket ekleyin.

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> 
tarayıcı önbelleği ve kullanıcı verileri

adb shell pm clear com.android.browser 

temizleyebilirsiniz adb komutunu kullanarak

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

+0

Bu, her cihazda çalışmayacaktır. Bazıları bunu görmezden geliyor –

8

ancak

bkz android yazılımın çalışması bu sorunu, bu işe yaramaz benim önceki question bununla ilgili olarak

Android tarayıcı önbelleğini sürekli olarak arka plan koşu servisini kullanarak temizlemeniz gerekirse geçici bir çözüm olsa da, "android.content.pm.IPackageDataObserver" ile yapılabilir. Bunu izlemek için şu servis test edilmiş ve iyi çalışıyor

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

Ben AJAX sürü kullanarak ve sürekli emülatör tarayıcısını ferahlatıcı benzer bir sorun üzerinde geldi. Bu iki yöntem bana yardımcı oldu.

AJAX - eğer değiştirilmişse reqeust değerini almak için istek başlığını ayarlayın. Başlık bilgilerini ayarlamak -

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

Ya jquery $ .ajax()

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

PHP kullanarak edersek ile

.

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"); 

Kaynak: http://ajaxpatterns.org/XMLHttpRequest_Call

2

Neden önbellek manifestosunu kullanmıyorsunuz?Ağ bölümünde js dosyaları koyarsanız

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

, bu gerekenleri yapmalıdır: AĞ altında listelenen

Dosyalar: önbellek manifest dosyasında bölüm başlığı-beyaz listede olduğu sunucuya bağlantı gerektiren kaynaklar. Kullanıcı çevrimdışı olsa bile, bu tür kaynaklara yapılan tüm istekler önbelleği atlar. Joker karakterler kullanılabilir.

0

Android öykünücüsü kullanıyorum ve Tarayıcıyı açıp menüyü tıklatarak yerleşik Tarayıcıyı temizleyebildim. Orada Ayarlar'ı ve ardından "Gizlilik ve güvenlik" seçeneğini seçtim. Bu, önbelleği temizle seçeneğine izin verdi.

İlgili konular