2012-02-16 37 views
7

Tôi có một khối hình ảnh mà tôi muốn tải trên màn hình của mình. Tất cả hình ảnh là các tệp mà tôi đã tải xuống và lưu trữ trên SD-CARD.Tải nhanh bitmap của Android

Cho đến nay, tôi đã tìm thấy hai cách để thực hiện, đầu tiên là tải chúng lên chủ đề chính, khi hoạt động bắt đầu, (tôi có khoảng 70 hình ảnh và mất khoảng 2,1 giây để tải tất cả).

Một cách khác là những gì tôi đang thử nghiệm ngay bây giờ. Tải chúng trên chủ đề riêng biệt, vì vậy trong khi đó tôi có thể hiển thị hoạt hình tải cho người dùng. Hiện tại, sự hiển thị của tôi với ThreadPoolExecutor mất 4,3 giây. Tôi đã làm nó trên 10 chủ đề.

Và phương pháp cuối cùng, (đó là điều duy nhất tôi chưa thử nghiệm) đang làm việc với trang tính ma.

Tôi không thể sử dụng bộ nhớ cache của ứng dụng vì trong ứng dụng của tôi, tôi có rất nhiều màn hình và mỗi màn hình đều có hình ảnh riêng.

Bạn nghĩ sao, cách nhanh nhất để tải lượng lớn hình ảnh và kỹ thuật gia tốc nào bạn biết có thể giúp tôi?

+0

Bạn chưa đề cập đến kích thước của hình ảnh của bạn và nếu bạn có thể giảm kích thước của chúng khi bạn tải chúng (ví dụ mất một JPEG 5 megapixel và tải nó dưới dạng hình thu nhỏ 320x240). Nếu bạn cho phép điều này, nó có thể đẩy nhanh quá trình tải hình ảnh. – BitBank

Trả lời

2

Một tùy chọn sẽ là sử dụng tạo bộ nhớ cache hình ảnh bằng cách sử dụng WeakReference để hình ảnh sẽ bị xóa khỏi bộ nhớ khi hệ thống gặp phải tình trạng bộ nhớ thấp. Bằng cách này bạn có thể giữ hình ảnh trong bộ nhớ và chỉ cần tải từ sdcard khi chúng không có trong bộ nhớ. Vì vậy, hoạt động hiện tại của bạn sẽ luôn giữ nguyên tham chiếu cứng đến bitmap được yêu cầu và bộ nhớ cache hình ảnh sẽ giữ tham chiếu yếu đến bitmap.

Sau đây là một số chi tiết thông tin về tài liệu tham khảo yếu:

JavaDoc weakReference

StackOverflow post discussing using weak reference for cache

+1

-1: cách tiếp cận này là vô dụng trên tất cả các thiết bị sdk 9 trở lên kể từ khi thu gom rác là rất tích cực nó gần như imediatly xóa tất cả các yếu refrences, phương pháp tiếp cận hiện tại là LRU Cache (xem http://developer.android.com/training /displaying-bitmaps/cache-bitmap.html) – for3st

8
  1. Không tải trên sợi chính. Với sự chậm trễ 2,1 giây, bạn gần như bị giết với lỗi ANR (ứng dụng không phản hồi) nếu bạn chặn chủ đề chính.

  2. Tải trong chuỗi riêng biệt. Không tạo 10 chủ đề, nhưng chỉ cần tạo một chuỗi AsyncTask và tải tất cả các hình ảnh của bạn theo một chủ đề khác trong doInBackground.

    Tải trong AsyncTask sẽ mất (gần) cùng thời gian khi tải trong chuỗi chính. Không đặt quá nhiều hình ảnh động ưa thích, do đó, chủ đề chính không tiêu tốn quá nhiều thời gian CPU.

0

Một cách để thực hiện việc này là triển khai một loại người nghe/người quan sát.

Từ chuỗi giao diện người dùng của bạn, khởi chạy chuỗi khác sẽ tải hình ảnh. Khi hình ảnh được tải, luồng sẽ gọi phương thức gọi lại được thực hiện trong lớp hoạt động để cập nhật chế độ xem hình ảnh tương ứng.

Thay vì nhiệm vụ asynch android, tôi sẽ đi cho chủ đề của tôi (gộp/Executors). Tôi sẽ nhận được tất cả các đường dẫn hình ảnh có thể trước khi tải chúng, và gửi chúng đến chủ đề tải hình ảnh. Và trong cuộc gọi trở lại tôi biết nơi để cập nhật hình ảnh.

Hoặc bạn cũng có thể kiểm tra cách Trình tải hoạt động trong trường hợp của bạn.

0

Rõ ràng, bạn không nên để hoạt động 2 giây trong chuỗi giao diện người dùng.

Tôi cho rằng ThreadPoolExecutor là một giải pháp godd, nhưng nó không phải là tối ưu để tạo ra nhiều chủ đề trong hồ bơi của bạn. Trên chủ đề nền là đủ. Tôi đặt cược bạn sẽ có hiệu suất tốt hơn chỉ đơn giản bằng cách thay đổi điều này.

Tôi không đề xuất một số trực tiếp từ Hoạt động vì it is fragile to config change.

Tôi không khuyên bạn nên làm việc với sprites. Tăng kích thước của một hình ảnh là rất nguy hiểm trên thiết bị di động nơi bộ nhớ bị giới hạn. Đặc biệt với các sprites, bạn sẽ phải nhận được các phần của Bitmap, do đó có bitmap đầy đủ trong bộ nhớ cho một thời điểm.

Bây giờ, tôi đã bỏ qua các câu hỏi cụ thể của bạn, tôi nghĩ bạn sẽ gặp khó khăn Lazy loading of images in a listview vì sự cố rất giống nhau.

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