2012-01-17 33 views
8

Hoạt động chính của ứng dụng của tôi là Activity có chứa Webview để tải các trang web.Cách kiểm soát mức sử dụng bộ nhớ khi gọi nhiều WebView trong Android?

Tôi ghi đè phương thức shouldOverrideUrlLoading(WebView view, String url) để thực hiện mọi yêu cầu URL gọi Intent và tải trong một hoạt động tương tự mới có chứa WebView.

Thực hiện điều này nhằm mang lại trải nghiệm tốt hơn khi nhấn phím BACK, sẽ chỉ hoàn thành hoạt động hiện tại và quay lại hoạt động trước, không cần thời gian để hiển thị lại trang so với sử dụng goBack() trong chế độ xem web đơn.

Nhưng bây giờ vấn đề là, sau khi tôi mở nhiều URL, tạo hàng đợi hoạt động dài trong nền, bộ nhớ mà nó sử dụng trở nên lớn.

Khi tôi quay lại trình khởi chạy và kiểm tra tiến trình, tôi có thể thấy ứng dụng của mình lưu trữ hơn 200 triệu dữ liệu. Điều này là không thể chấp nhận được ...

Điều thú vị là tôi có thể thấy ứng dụng của mình đã sử dụng hết bộ nhớ, nhưng trong chế độ xem Heap của DDMS trong Eclipse, tôi có thể thấy ứng dụng được cấp không quá 10M bộ nhớ. Vì vậy, tôi đoán 200M là webStorage được lưu trong bộ nhớ cache bởi Webview?

Có cách nào để kiểm soát bộ nhớ không?

Tôi đang xem xét chỉ lưu có thể 5 lớp hoạt động cùng một lúc và khi quay lại 5 lần, chỉ cần quay lại trang chủ. Nhưng vẫn không biết cách giải phóng bộ nhớ bên cạnh 5 hoạt động tôi cần, thứ mà tôi sẽ không bao giờ sử dụng nữa?

Hoặc nếu đó là vì WebView tự động lưu trang web được lưu vào bộ nhớ cache, làm cách nào tôi có thể quản lý thủ công này? Chẳng hạn như đặt giới hạn kích thước bộ nhớ cache tối đa hoặc số lượng trang?

+0

Đối với tôi đây là giải pháp tàn bạo để đạt được tốc độ ... Ghi đè cách nút quay lại hoạt động và chuyển sang hoạt động khác với trang cho tôi không thực sự là giải pháp. Bạn nên thử và tối ưu hóa trang để tải nhanh hơn, nhưng bằng cách sử dụng hình ảnh nén, hình ảnh nén, vv Có thể có một số phương pháp và cài đặt khác của WebView mà bạn có thể gọi để thử và tăng tốc mọi thứ. –

Trả lời

1

Nói chung, tôi đồng ý với nhận xét của Kevin. Tôi nghĩ rằng việc giữ nhiều đối tượng Activity xung quanh để ngăn tải lại WebView là phản trực giác đối với môi trường di động với các tài nguyên hạn chế như vậy.

Điều đó đang được nói, bạn có rất nhiều khả năng câu hỏi và giải pháp khác nhau, vì vậy tôi không có một câu trả lời nào trong đầu. Xem qua các liên kết này để xem liệu có ích gì không:

ActivityManager - có rất nhiều thứ bạn có thể sử dụng, xem các lớp con của nó.

ActivityManager.RunningTaskInfo - Không bao giờ sử dụng, nhưng dường như có một số nội dung hữu ích, đặc biệt khi xác định Activity đang chạy.

ActivityManager.MemoryInfo - Có thể cung cấp cho bạn thông tin về bộ nhớ hệ thống có sẵn cũng như ngưỡng dưới cùng của bộ nhớ.

Application.onLowMemory() - Cho bạn biết khi nào ứng dụng của bạn là bộ nhớ. Bạn có thể ghi đè lên phương pháp này và bắt đầu phá hủy Activity khi điều này được gọi. Bạn có thể cần phải gọi super.onLowMemory() để đảm bảo hệ điều hành xử lý những gì cần thiết.

Một giải pháp khả thi liên quan đến việc kiểm soát số lượng các hoạt động:

Override Application và tạo ra một public static ArrayList<Activity> chứa 5 Activity đối tượng.Bất cứ khi nào bạn thực hiện một onCreate() cho một Activity bạn có thể thêm Hoạt động vào ArrayList và sau đó kiểm tra kích thước. Nếu kích thước> 5 thì gửi intent đến Activity ở vị trí 0 sẽ làm cho nó xử lý ý định và gọi finish(). Sau đó, loại bỏ các đối tượng từ ArrayList.

Không nên quá nhiều công việc, nhưng mặt trái là bạn phải quản lý thủ công mọi thứ. Tôi chắc chắn có một giải pháp hiểu biết hơn có thể.

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