2015-10-17 131 views
9

我一直在試圖爲WebView實現基於光盤的緩存,但只取得了部分成功,我特別試圖緩存.js JavaScript外部文件,這會減慢JavaScript網頁的加載速度。JavaFx WebView緩存

Oracle文檔指出: 「當web視圖組件工作時,你應該記住,它具有默認的內存緩存 這意味着,一旦含有的WebView組件在應用程序關閉任何緩存的內容會丟失。 但是,開發人員可以通過java.net.ResponseCache類在應用程序級別實現緩存。「

但事實並非如此。我使用java.net.ResponseCache類實現了一個內存緩存,但WebView很少使用它 - 它不時從緩存中存儲和檢索favicon.png - 沒有性能增益。

我證實了通過分析網絡通信量的WebView不緩存,從而證實了什麼是JDK-8014501說: 「雖然使用JavaFX的WebView組件javafx.scene.web.WebView導航,才發現, 每請求每次從服務器檢索所有資源,即使以前的活動剛剛檢索到資源。此行爲已通過捕獲和分析網絡流量進行驗證。 性能影響相當大。 JDK-8014501,於是我使用「URL.setURLStreamHandlerFactory」編寫了一個緩存處理程序來攔截所有的URLConnections到默認的sun處理程序。我在這方面取得了一些成功,並且能夠緩存.js javascript文件並顯着提高性能,但是有些bug處理某些網站,特別是Outlook的電子郵件。

在研究我的代碼處理方式時,例如,我發現URLLoader代碼在代碼中設置了setUsesCaches(false),代碼中包含以下注釋(URLLoader.java的第279行,代碼爲當前1.8.0_66) :
//鑑於WebKit具有其自己的緩存,請勿使用任何URLConnection緩存,即使有人安裝它們也不要使用

//作爲一個副作用,這可以修復WebPane問題而不是
//可以和插件緩存一起使用,該插件緩存是
// RT-11880的原因之一。

那麼有人可以給我一個關於真正發生的事情嗎?

  • Oracle文檔說WebKit有一個可以被ResponseCache覆蓋的內存緩存,事實並非如此。
  • JDK-8014501聲明問題,但被標記爲「不是問題」。爲什麼這不是問題?
  • 對「URL.setURLStreamHandlerFactory」和「URLConnection」攔截進行編碼的signifant產生了一個功能緩存,其性能顯着提高,但是被故意引入到URLLoader代碼中的問題取消了。

預先感謝任何反饋,

+1

我有相反的效果/問題。我的CSS文件由WebView緩存,我無法阻止它!只有在RESTARTING整個Java(FX) - 應用程序(或每次更改時重命名CSS文件)之後,我的CSS更改纔可見。覆蓋'ResponseCache'對我來說不起作用(我的響應緩存永遠不會被調用)... – Ben

+0

很奇怪,這裏也是與你的問題完全相反的:http://stackoverflow.com/q/16211920/3887073 – Ben

+0

@本你有沒有解決好運?我也有同樣的問題。 –

回答

1

我一直在努力周圍無緩存的WebView通過實現從HttpUrlConnectionHttpsUrlConnection派生我自己的類,並通過我自己的實現的URLStreamHandlerFactory

基本上我攔截所有傳出的http和https請求,檢查我的緩存中是否有數據。如果沒有,我加載來自原始資源的數據並存儲在緩存目錄中。如果我已經有了這些數據,我會從緩存中提供它。

我還沒有實現緩存頭等,因爲對我的用例來說,這是沒有必要的。

這裏有太多的代碼要發佈,但如果您有興趣,可以查看mapjfx的代碼,並特別檢查com.sothawo.mapjfx.offline包中的類。

該解決方案使WebView完全不瞭解緩存實現。