2011-12-11 40 views
9

Tôi đang cố gắng tải phiên bản HTML5 được lưu vào bộ nhớ cache của một trang web để hiển thị khi mạng nằm bên trong chế độ xem web.hiển thị phiên bản webview được lưu trong bộ nhớ cache trên android

Tôi đã ghi đè onReceivedError ok và khi mạng xuống phương thức này được gọi. Vấn đề là nó hiển thị thông báo "Trang Web không có sẵn" chung.

Tôi làm cách nào để hiển thị phiên bản HTML5 được lưu trong bộ nhớ cache của trang? Bộ nhớ ngoại tuyến của webapp chắc chắn hoạt động, vì nó hoạt động tốt trong phiên bản dành cho máy tính để bàn của Firefox và Chrome.

Tôi biết tôi có thể gọi loadData vào chế độ xem theo cách thủ công trong onReceivedError, nhưng tôi không chắc chắn nơi tôi có thể lấy giá trị được lưu trong bộ nhớ cache HTML5.

Lưu ý: Nếu tôi đặt một số dữ liệu giả trong loadData như view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); và sau đó nhấp lại (bằng cách phát hiện lại sự kiện và kêu gọi webview.goBack(); sau đó phiên bản cache của trang được hiển thị ok

Dưới đây là một số dòng mã. tôi thêm vào thiết lập webview:.

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
webview.getSettings().setAppCacheMaxSize(1024*1024*8);       
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache"); 
webview.getSettings().setAllowFileAccess(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setJavaScriptEnabled(true); 

Trả lời

6

Cố gắng tìm hiểu tình trạng mạng sử dụng

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 

(Detect whether there is an Internet connection available on Android)

này cũng cần

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

trong AndroidManifest.xml của bạn

Bây giờ bạn có thể thiết lập các hành vi bộ nhớ cache hoặc để LOAD_CACHE_ONLY hoặc LOAD_NO_CACHE, tuỳ thuộc vào việc kết nối mạng có sẵn, với

webview.getSettings().setCacheMode(...) 
+0

này có lẽ là "sạch" giải pháp, vì vậy bệnh cung cấp cho bạn những điểm bounty :) – Marty

2

tôi nghĩ rằng một giải pháp tốt sẽ được sử dụng LOAD_NORMAL và onReceivedError Navigate LẠI tôi nghĩ rằng đây sẽ được tải bộ nhớ cache theo các tài liệu (không chắc chắn nếu tôi nhớ chính xác) nhưng phải cẩn thận không bị kẹt trong một vòng lặp vô hạn


Đó là lạ .. Theo documentation:

Override cách bộ nhớ cache được sử dụng. Cách bộ nhớ cache được sử dụng dựa trên trên tùy chọn điều hướng. Để tải trang bình thường, bộ nhớ cache được kiểm tra và nội dung được xác thực lại khi cần. Khi điều hướng trở lại, nội dung không được xác thực lại, thay vào đó nội dung chỉ được lấy từ bộ nhớ cache. Chức năng này cho phép máy khách ghi đè hành vi này.

Tuy nhiên hành vi mà bạn muốn dường như không thể là một trong những:

  1. LOAD_CACHE_ELSE_NETWORK

    Sử dụng bộ nhớ cache nếu nội dung là ở đó, ngay cả khi hết hạn (ví dụ, lịch sử nav) Nếu nó không có trong cache, tải từ mạng.

  2. LOAD_CACHE_ONLY

    Không sử dụng mạng, tải từ chỉ bộ nhớ cache.

  3. LOAD_DEFAULT

    mẫu mặc định sử dụng bộ nhớ cache

  4. LOAD_NORMAL

    mô hình sử dụng bộ nhớ cache Bình thường

  5. LOAD_NO_CACHE

    Không sử dụng bộ nhớ cache, tải từ mạng


Tôi không biết nếu bạn có thể phân lớp các WebView để có được lưu lượng mong muốn.


+0

xin lỗi quên đề cập đến, tôi thay đổi nội dung câu hỏi của tôi .. – Marty

+0

@Marty bạn đã cố gắng thay đổi LOAD_DEFAULT để LOAD_NORMAL –

+0

vẫn chỉ có chung "trang web không có sẵn" tin nhắn khi kết nối mạng là xuống khi tôi sử dụng LOAD_NORMAL – Marty

1

Liệu nó không hoạt động nếu bạn chỉ đơn giản là để cho các trình duyệt xử lý này? Chỉ định tệp kê khai trong thẻ HTML như sau:

<html manifest="mycache.appcache"> 

... và trình duyệt sẽ tự động sử dụng thẻ này khi không có kết nối, bạn không cần thay đổi bất kỳ cài đặt nào.

0

Trước tiên, bạn nên đặt quyền trong AndroidManifest của mình.xml

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

Sau đó kiểm tra mạng internet là bật hoặc tắt bởi:

private boolean isNetworkAvailable() { 
      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
      return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
     } 

thêm Cuối cùng dưới mã với Webview bạn đối tượng

webView = (WebView) findViewById(R.id.WebEngine); 
     webView.getSettings().setAppCacheMaxSize(5 * 1024 * 1024); // 5MB 
     webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath()); 
     webView.getSettings().setAllowFileAccess(true); 
     webView.getSettings().setAppCacheEnabled(true); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
     if (!isNetworkAvailable()) { // loading offline 
      webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
     } 
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1"); 

Thats nó nếu internet của bạn là trên trang web của bạn mở versi thông thường trên và được lưu trong bộ nhớ cache và nếu mạng của bạn tắt thì tự động mở trong phiên bản được lưu trong bộ nhớ cache.

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