2010-08-21 31 views
18

Tôi hiện có các tệp hình ảnh trong bộ nhớ cache của ứng dụng trong thư mục con cache cho ứng dụng. Các hình ảnh được sử dụng trong một ListView và được lưu trữ trong một số HashMap của SoftReferences đến Bitmaps. Vì vậy, câu hỏi của tôi là, cách tốt nhất để lưu trữ các tệp hình ảnh này mà không làm tăng không gian mà ứng dụng của tôi sử dụng VÀ vẫn đáp ứng được từ quan điểm của người dùng là gì.Thực tiễn tốt nhất khi lưu tập tin trong Android

Những điều tôi sắp có liên quan:

Tôi biết người dùng có thể xóa bộ nhớ cache và rằng nó được thực hiện tự động khi không gian là thấp trên bộ nhớ trong, nhưng tôi cảm thấy hầu hết người dùng sẽ thấy một vài MB ứng dụng và gỡ bỏ nó . Ngoài ra nếu không gian liên tục thấp, ứng dụng của tôi sẽ tiếp tục tải xuống hình ảnh, khiến cho hình ảnh xuất hiện chậm hơn.

Hầu hết các thiết bị đều có thẻ SD được cài đặt sẵn, nhưng tôi nên làm gì khi nó không được lắp vào? Thẻ SD cũng có thể chậm hơn so với bộ nhớ trong, ảnh hưởng đến hiệu suất của ứng dụng của tôi.

Tôi có nên bao gồm tùy chọn để chọn vị trí của bộ nhớ cache không?

Tôi có nên cố gắng quản lý kích thước bộ nhớ cache của mình (có thể là trong/cache hoặc/sdcard) hoặc chỉ quên nó?

Cảm ơn bạn đã dành thời gian (một thời gian dài mà tôi biết) và vui lòng đăng bất kỳ trải nghiệm liên quan nào.

Trả lời

15

tôi không thể cung cấp cho bạn một bộ đầy đủ các thông lệ tốt nhất, nhưng tôi có thể cung cấp những gì tôi đã học được cho đến nay:

Quản lý bộ nhớ cache của bạn là một ý tưởng tốt. Bộ nhớ cache của ứng dụng của tôi là như vậy mà tôi biết rằng tôi sẽ không bao giờ cần nhiều hơn một số tệp được lưu trong bộ nhớ cache, vì vậy bất cứ khi nào tôi chèn tệp mới vào bộ nhớ cache, tôi sẽ xóa các tệp cũ nhất cho đến khi tôi nằm trong giới hạn mà tôi đã đặt. Bạn có thể làm một cái gì đó tương tự dựa trên kích thước, hoặc chỉ đơn giản là tuổi tác.

Lưu vào thẻ SD, nếu có, là ý tưởng hay nếu bộ nhớ cache của bạn cần chiếm nhiều dung lượng. Bạn sẽ cần phải quản lý không gian đó một cách cẩn thận, vì nó sẽ không tự động xóa không gian đó cho bạn. Nếu bạn đang lưu vào bộ nhớ đệm các tệp hình ảnh, hãy nhớ đặt chúng trong một thư mục bắt đầu bằng dấu chấm, như "/yourAppHere/.cache". Điều này sẽ giữ cho hình ảnh không hiển thị trong thư viện, điều này thực sự gây phiền nhiễu.

Cho phép người dùng chọn vị trí của bộ nhớ cache có vẻ như quá mức với tôi, nhưng nếu khán giả của bạn rất geeky, nó có thể được đánh giá cao.

Tôi chưa nhận thấy có nhiều hình phạt khi lưu vào bộ nhớ cache cho SD, nhưng tôi không biết ứng dụng của bạn sử dụng thông tin đó như thế nào.

+0

Tôi thích suy nghĩ của bạn về việc ngăn không cho phòng trưng bày nhìn thấy hình ảnh. Theo những điều kiện nào thì phòng trưng bày sẽ chọn chúng? Tôi vẫn chưa thấy hình ảnh ngẫu nhiên và tôi biết có một số ứng dụng như twidroid trên điện thoại của tôi lưu trữ chúng. – smith324

+1

@ chris324 Hãy xem http://developer.android.com/guide/topics/data/data-storage.html#filesExternal dưới tiêu đề 'Lưu tệp cần được chia sẻ' – Eric

+0

@Eric cảm ơn vì liên kết, giao diện giống như một thư mục bên ngoài với một tệp rỗng có tên '.nomedia' sẽ bị bỏ qua bởi mediascanner. Nó cũng giống như getExternalCacheDir() là mới trong 2.2 sẽ hữu ích. – smith324

2

Mọi người đều có ý tưởng hay. Tôi thích ý tưởng sử dụng SoftReference 's, mặc dù tôi không chắc chắn làm thế nào thường những người được làm sạch lên, vì điều này thay đổi rất nhiều từ VM đến VM. Bạn có thể muốn kết hợp điều đó với thông thường HashMap để ngăn toàn bộ bộ nhớ cache bị xóa sau mỗi vài phút.

EclipseLink có một vài triển khai bộ nhớ cache khác nhau và pretty good documentation on them. Bạn có thể tận dụng một số ý tưởng từ việc triển khai (ví dụ: LRU, MRU, v.v.). ví dụ.,

  • bộ nhớ cache cứng
  • bộ nhớ cache mềm
  • kết hợp cứng/mềm bộ nhớ cache

Vì bạn đang điều chỉnh một bộ nhớ cache xuống nitty-gritty, tôi muốn giới thiệu điều chỉnh nó với các thiết bị khác nhau dựa trên các thông số kỹ thuật cứng. Đây thường là thiết kế tồi, nhưng phạm vi của phần cứng mà phần mềm của bạn chạy trên nhiệm vụ đó, IMHO. ví dụ:

  • Phát hiện lượng bộ nhớ khả dụng trên thẻ SD. Hầu hết các điện thoại thông minh mới đi kèm với thẻ SD nhiều GB và rất khó để sử dụng thường xuyên cho hầu hết người dùng. Sử dụng đi! Bạn cũng có thể phát hiện dung lượng trống trên thẻ SD khi khởi động và tăng/giảm kích thước bộ nhớ cache khi khởi động.
  • Phát hiện lượng bộ nhớ khả dụng và định cấu hình bộ nhớ cache của bạn với ý nghĩ đó. Nếu người dùng đang sử dụng ứng dụng chuyên sâu phần cứng, tôi không nghĩ họ sẽ nhớ rằng nó chiếm 200MB RAM và cung cấp trải nghiệm người dùng rất nhanh, đặc biệt là vì họ đã chi rất nhiều tiền để có điện thoại có 1 RAM 2 GB.

Chúc may mắn!

+0

Đọc thú vị. Tôi thích khái niệm sử dụng bộ nhớ cache tham chiếu cứng/mềm kết hợp. Tinh chỉnh kích thước bộ nhớ cache dựa trên heap có sẵn có vẻ như hơn giết cho tôi mặc dù, đặc biệt là kể từ khi VM sẽ cung cấp cho bạn về cùng một số tiền trên mỗi điện thoại. – smith324

+0

Hãy rất cẩn thận với SoftReferences trong Android. Hệ thống Android sẽ xóa chúng nhanh nhất có thể, ngay cả khi đây không phải là hành vi được các tiêu chuẩn Java đề xuất. Thay vì Softreferences sử dụng một Cache LRU được giới hạn trong một phần của bộ nhớ có sẵn. http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Janusz

0

Tôi có nên bao gồm tùy chọn để chọn vị trí của bộ nhớ cache không?

IMO: Không, chúng ta hãy làm cho nó nhiều hơn đơn giản càng tốt (trừ bạn có thể bao gồm thiết lập trước cho người sử dụng chuyên gia)

Tôi có nên cố gắng để quản lý kích thước của bộ nhớ cache của tôi (có thể là trong thư mục/bộ nhớ cache hoặc/sdcard) hoặc chỉ cần quên nó?

IMO: Đây là tùy chọn, nó là đôi thanh kiếm: làm việc nhiều hơn của bạn trên nền sẽ giúp người dùng thuận tiện hơn mà còn nhiều lỗi dễ bị

Sử dụng libs 3rd: IMO sử dụng thư viện thứ 3 như Picasso tốt hơn, nó xử lý bộ nhớ cache tự động theo thứ tự: Bộ nhớ cache -> Bộ nhớ cache trên đĩa -> Mạng

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