2015-10-17 47 views
9

Tôi đã cố gắng triển khai bộ nhớ cache dựa trên đĩa cho WebView nhưng chỉ với một phần thành công, tôi đặc biệt cố gắng lưu các tệp bên ngoài .js javascript làm chậm việc tải các trang web javascript rất nhiều.Bộ nhớ cache JavaFx WebView

Tài liệu Oracle tuyên bố rằng: "Khi làm việc với thành phần WebView, bạn nên nhớ rằng nó có bộ đệm ẩn trong bộ nhớ mặc định. Điều đó có nghĩa là mọi nội dung được lưu trong bộ nhớ cache bị mất khi ứng dụng chứa thành phần WebView bị đóng Tuy nhiên, nhà phát triển có thể triển khai bộ nhớ cache ở cấp ứng dụng bằng lớp java.net.ResponseCache. "

nhưng điều này không đúng. Tôi đã thực hiện một bộ nhớ đệm trong bộ nhớ bằng cách sử dụng lớp java.net.ResponseCache nhưng nó rất hiếm khi được sử dụng bởi WebView - theo thời gian nó lưu trữ và lấy favicon.png từ bộ nhớ cache - không có hiệu năng nào.

Tôi khẳng định bằng cách phân tích lưu lượng mạng mà WebView không phải là bộ nhớ đệm, do đó xác nhận những gì được nêu trong JDK-8.014.501: "Trong khi điều hướng với JavaFX phần WebView javafx.scene.web.WebView, nó đã được tìm thấy, rằng mỗi yêu cầu truy xuất tất cả các tài nguyên từ máy chủ mỗi lần ngay cả khi các hoạt động trước đó vừa truy xuất tài nguyên. Hành vi này đã được xác minh bằng cách chụp và phân tích lưu lượng mạng. JDK-8014501, vì vậy tôi đã viết trình xử lý bộ nhớ cache bằng cách sử dụng "URL.setURLStreamHandlerFactory" để chặn tất cả các URLConnections đến trình xử lý mặt trời mặc định. Tôi đã có một số thành công với điều này và đã có thể cache các tập tin javascript jjs và tăng hiệu suất đáng kể, nhưng có lỗi xử lý một số trang web, đặc biệt là email của Outlook.

Khi xem xét mã của tôi đã được xử lý, tôi đã tìm thấy ví dụ rằng mã URLLoader được đặt setUsesCaches (false) với các nhận xét sau trong mã (tại dòng 279 của URLLoader.java trong mã 1.8.0_66 hiện tại) :
// Cho rằng WebKit có bộ nhớ cache riêng, không sử dụng
// mọi URLConnection lưu trữ, ngay cả khi ai đó cài đặt chúng.
// Là một tác dụng phụ, điều này khắc phục sự cố WebPane không
// hoạt động tốt với bộ nhớ cache của trình cắm, là một trong số
// nguyên nhân cho RT-11880.

Vì vậy, ai đó có thể ra khỏi đó, vui lòng cho tôi biết về những gì đang diễn ra?

  • Tài liệu Oracle cho biết WebKit có bộ nhớ cache trong bộ nhớ có thể bị overriden bởi ResponseCache, đây không phải là trường hợp.
  • JDK-8014501 nêu rõ sự cố nhưng đã bị gắn cờ "không phải là vấn đề". Tại sao nó không phải là một vấn đề?
  • mã hóa có dấu hiệu xung quanh việc chặn URL "set.StreamHandlerFactory "và" URLConnection "tạo ra bộ nhớ cache chức năng với hiệu suất đáng kể, nhưng được hoàn tác bằng các vấn đề được giới thiệu một cách cố tình vào mã URLLoader.

Cảm ơn trước cho bất kỳ thông tin phản hồi,

+1

Tôi có hiệu ứng/vấn đề ngược lại. CSS-Files của tôi được lưu trữ bởi WebView và tôi không thể ngăn chặn nó! Các thay đổi đối với CSS của tôi chỉ hiển thị sau khi RESTARTING toàn bộ Java (FX) -Ứng dụng (hoặc khi đổi tên tệp CSS-File trên mỗi thay đổi). Ghi đè 'ResponseCache' không hoạt động cho tôi (bộ nhớ cache phản hồi của tôi sẽ không bao giờ được gọi) ... – Ben

+0

lạ, đây cũng chính xác là ngược lại với vấn đề của bạn: http://stackoverflow.com/q/16211920/3887073 – Ben

+0

@ Ben bạn có may mắn khi giải quyết không? Tôi có cùng một vấn đề. –

Trả lời

1

Tôi đã được làm việc xung quanh WebView phi bộ nhớ đệm bằng cách thực hiện các lớp học của riêng tôi có nguồn gốc từ HttpUrlConnectionHttpsUrlConnection và bằng cách sử dụng thực hiện riêng của tôi về URLStreamHandlerFactory.

Về cơ bản, tôi chặn tất cả các yêu cầu http và https gửi đi, hãy kiểm tra xem tôi có dữ liệu trong bộ nhớ cache của mình hay không. Nếu tôi không tải dữ liệu từ tài nguyên gốc và lưu trữ trong thư mục bộ nhớ cache. Nếu tôi đã có dữ liệu, tôi sẽ gửi nó từ bộ nhớ cache của mình.

Tôi chưa triển khai tiêu đề bộ nhớ cache, vì trường hợp sử dụng của tôi, điều này là không cần thiết.

Có quá nhiều mã để đăng ở đây, nhưng nếu bạn quan tâm, bạn có thể kiểm tra mã tại mapjfx và kiểm tra đặc biệt là các lớp trong gói com.sothawo.mapjfx.offline.

Giải pháp này khiến WebView hoàn toàn không biết về việc triển khai bộ nhớ đệm.

Các vấn đề liên quan