2010-07-05 33 views
5

Tôi đã xem xét một số bài đăng về tải chậm nhưng tôi tin rằng vấn đề của tôi hơi khác một chút.Android: tải chậm trong Thư viện

Tôi có một thư viện (lớp của tôi mở rộng Thư viện) hiển thị 20 hình ảnh có kích thước khá lớn (400-500K mỗi hình ảnh). Tôi không thể tải tất cả chúng vào thư viện vì tôi nhận được ngoại lệ OutOfMemory.
Vì vậy, tôi đã tạo một mảng gồm 20 Bản vẽ và ban đầu có 9 phần tử đầu tiên (hình ảnh đến từ Web) và đặt tất cả phần còn lại thành rỗng. Ý định của tôi là như thế này: trên một rãnh bên phải, lấy phần tử không. 10 và đặt thành phần tử không. 0. Trên một nhánh khác đến phần tử tìm nạp phải không. 11 và đặt thành phần tử không. 1 đến null. Cùng một logic trên một fling trái.

Vấn đề là tôi có thể chạy nhanh hơn nhiều so với các thành phần được tìm nạp. bộ sưu tập của tôi có một BaseAdapter và getView của nó() trông giống như sau:

 
public View getView(int position, View convertView, ViewGroup parent){ 
    ImageView imageView = new ImageView(); 
    imageView.setDrawable(imageArray[position]; 
    .... 
    .... 

    return imageView; 
} 

Làm thế nào để nói với getView() - nếu imageArray [vị trí] vẫn còn null, hiển thị một "đang tải ..." thoại và một khi nó được thiết lập lặp lại chính mình với cùng một vị trí?
Tôi không muốn xem imageView trống và sau đó được đặt khi đang di chuyển. Tôi muốn không thể nhìn thấy hình ảnh ở tất cả cho đến khi nó được thiết lập.

Cảm ơn.

+1

Có một bài đăng tuyệt vời trên blog Android (cũng như một số mã mẫu) trả lời câu hỏi của bạn: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally

Trả lời

6

Thư viện được thiết kế để có trải nghiệm mượt mà. Nó sẽ là giao diện người dùng rất xấu nếu bạn chặn màn hình và không chuyển sang hình ảnh tiếp theo cho đến khi nó được tải xuống. Bằng cách này, người dùng sẽ không thể tống khứ được. Bạn sẽ hiển thị một số chỉ báo tải thay vì hình ảnh trong khi đang tải.

Tôi nghĩ kịch bản của bạn khá phổ biến. Bạn nên tải xuống hình ảnh và hiển thị chúng. Nếu bạn nhận được OutOfMemory, bạn có thể thử thay thế hình ảnh Strange out of memory issue while loading an image to a Bitmap object.

Nếu vẫn còn OutOfMemory, bạn nên xóa bitmap khỏi bộ nhớ và lưu chúng vào SD. Vì vậy, khi người dùng quay trở lại, bạn có thể tải hình ảnh từ SD một lần nữa, nó sẽ đủ nhanh. Và mức tiêu thụ bộ nhớ sẽ thấp hơn. Như bạn đề nghị bạn có thể có 10 hình ảnh gần đây nhất được lưu trong bộ nhớ cache và những hình ảnh khác được lưu trong bộ nhớ cache trên SD.

Bạn có thể xem mã mẫu của tôi Lazy load of images in ListView. Trên thực tế nó là một adapter ListView nhưng bạn có thể áp dụng nó vào thư viện với những sửa đổi nhỏ. Tôi nghĩ rằng nó sẽ làm chính xác những gì bạn cần.

+0

Cảm ơn Fedor . Sẽ thử ... – Rob

+0

"Bạn nên hiển thị một số chỉ báo tải thay vì hình ảnh trong khi đang tải." Làm cách nào để đạt được điều này? Tôi biết làm thế nào để đặt một chỉ báo tải trong một ProgressDialog ở phía trước của bộ sưu tập, nhưng làm thế nào để tôi đặt các chỉ số thay vì hình ảnh chính nó? Chỉ để nhắc bạn, imageView được tạo khi chạy. Nếu nó được định nghĩa trong XML, tôi có thể gán cho nó một nguồn mặc định nhưng đây không phải là trường hợp ở đây ... cảm ơn. – Rob

+1

Nó không phải là một vấn đề. Bạn có thể tạo ProgressControl trong thời gian chạy thay vì ImageView. Hoặc bạn có thể tạo ImageView khi chạy và hiển thị một số ảnh gốc trong khi hình ảnh thực đang được tải xuống. Tôi hiển thị hình ảnh gốc trong mã mẫu của tôi. – Fedor

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