2015-10-17 29 views
9

私はWebView用のディスクベースのキャッシュを実装しようとしていましたが、部分的にしか成功しませんでした。特に、javascript Webページの読み込みを遅くする.js JavaScriptファイルをキャッシュしようとしています。 WebViewのコンポーネントで作業する場合 」は、あなたはそれがデフォルトのインメモリキャッシュを持っていることを覚えておいてください それは、WebViewのコンポーネントを含むアプリケーションが閉じられた後、任意のキャッシュされたコンテンツが失われることを意味しますJavaFx WebViewキャッシュ

Oracleのドキュメントは、と述べています。 。 しかし、開発者はjava.net.ResponseCacheクラスを使ってアプリケーションレベルでキャッシュを実装することができます。 "

これは当てはまりません。 java.net.ResponseCacheクラスを使用してメモリ内キャッシュを実装しましたが、WebViewではほとんど使用されていません。時折、キャッシュからfavicon.pngを取得して取得します。パフォーマンスは向上しません。

私はWebViewのは、このようにJDK-8014501に記載されているものを確認し、キャッシュされていないことをネットトラフィック分析することにより確認:そのすべての 、 「JavaFXのWebViewのコンポーネントjavafx.scene.web.WebViewでナビゲートしながら、それが発見されたが以前のアクティビティがリソースを取得したばかりであっても、その都度、すべてのリソースをサーバーから取得します。 JDK-8014501を参照して、 "URL.setURLStreamHandlerFactory"を使用してキャッシュハンドラを作成し、デフォルトのsunハンドラへのすべてのURLConnectionsをインターセプトしました。私はこれでいくつかの成功を収め、.jsのjavascriptファイルをキャッシュしてパフォーマンスを大幅に向上させることができましたが、いくつかのWebサイト、特にOutlookの電子メールを処理するバグがありました。

私のコードの処理方法を調べると、URLLoaderコードがsetUsesCaches(false)をコード内で次のように設定していることがわかりました(現在の1.8.0_66コードのURLLoader.javaの279行目) :
// WebKitに独自のキャッシュがあるとすれば、誰かがそれらをインストールしても、
// URLConnectionキャッシュを使用しないでください。
//これにより、WebPaneの問題は修正されていません。
//プラグインキャッシュでうまく動作しています(
// RT-11880の原因)。

誰かがそこにいることができますので、本当に何が起こっているのか頭をアップしてください。

  • Oracleのマニュアルによると、WebKitにはResponseCacheで上書きできるメモリがありますが、そうではありません。
  • JDK-8014501は問題を述べていますが、「問題ではありません」というフラグが付けられています。なぜそれは問題ではないのですか?
  • "URL.setURLStreamHandlerFactory"と "URLConnection"を傍受すると、パフォーマンスが大幅に向上する機能キャッシュが生成されますが、意図的にURLLoaderコードに導入された問題によって取り消されます。任意のフィードバックを事前に

おかげで、

+1

私は反対の効果/問題があります。私のCSSファイルはWebViewによってキャッシュされており、私はそれを防ぐことができません! CSSへの変更は、Java(FX)アプリケーション全体を再実行した後(または各変更時にCSSファイルの名前を変更する)にのみ表示されます。私のレスポンスキャッシュは決して呼び出されないでしょう... – Ben

+0

奇妙なことに、あなたの問題とはまったく反対です:http://stackoverflow.com/q/16211920/3887073 – Ben

+0

@あなたは解決に運があったのですか?私は同じ問題を抱えています。 –

答えて

1

私はHttpUrlConnectionHttpsUrlConnection由来自分のクラスを実装することにより、およびURLStreamHandlerFactoryの私の独自の実装を使用することにより、非キャッシュのWebViewを中心に取り組んできました。

基本的にすべての発信httpとhttps要求を傍受し、自分のキャッシュにデータがあるかどうかを確認します。そうでない場合は、元のリソースからデータをロードし、キャッシュディレクトリに格納します。すでにデータがある場合は、キャッシュからデータを引き渡します。

キャッシュヘッダーなどを実装していません。なぜなら、私の使用例ではこれは必要ないためです。

ここに投稿するコードが多すぎますが、興味がある場合はmapjfxのコードをチェックし、特にcom.sothawo.mapjfx.offlineパッケージのクラスを確認してください。

このソリューションでは、WebViewはキャッシングの実装に全く気づかれません。

関連する問題