12/08/2018, 13:44

Load Bitmap Efficiently in Android [Part 1]

Thuật ngữ Load Bitmap Efficiently Chúng ta biết rằng trong lập trình Mobile nói chung và Android nói riêng, Bitmap luôn được sử dụng rất nhiều để tạo Graphic Design cho ứng dụng bởi lẽ chúng sẽ tạo nên sự trực quan cho người dùng hơn là những dòng chữ khô khan. Một ứng dụng đẹp là một ứng dụng ...

Thuật ngữ Load Bitmap Efficiently

  • Chúng ta biết rằng trong lập trình Mobile nói chung và Android nói riêng, Bitmap luôn được sử dụng rất nhiều để tạo Graphic Design cho ứng dụng bởi lẽ chúng sẽ tạo nên sự trực quan cho người dùng hơn là những dòng chữ khô khan. Một ứng dụng đẹp là một ứng dụng có Graphic Design đẹp và dĩ nhiên, đó là ứng dụng thành công về mặt thu hút người dùng mặc dù nội dung có thể chưa thực sự nổi bật.
  • Một ứng dụng Mobile thường sẽ phải làm việc rất nhiều với Bitmap như load ảnh từ server, từ resource hay tạo những icon, những custom view … Thường thì những công việc này sẽ làm cho ứng dụng trở nên ì ạch, chậm chạp nếu chúng ta không xử lý đúng cách. Bài toán đặt ra là làm thế nào để xử lý hiệu quả chúng? Thuật ngữ Load Bitmap Efficiently ra đời dựa trên những yêu cầu đó.

Tại sao phải Load Bitmap Efficiently

  • Hình ảnh thì luôn có những kích cỡ khác nhau. Tuy nhiên trong một số trường hợp, ta chỉ cần hiển thị vừa đủ theo kích thước đã định sẵn. Mặt khác, một ứng dụng luôn được cấp phát một mức bộ nhớ (RAM) xác định cho việc xử lý các công việc trong cả ứng dụng, do vậy việc sử dụng chúng phải thật hợp lý để không ảnh hưởng đến hiệu suất của toàn bộ ứng dụng. Trong trường hợp này, một hình ảnh với độ phân giải thấp hơn vừa đủ sẽ là lựa chọn hợp lý hơn cả.
  • Chắc hẳn trong chúng ta, ai cũng mong muốn ứng dụng mình làm ra phải thật đẹp những phải luôn đảm bảo performance và trải nghiệm người dùng thật tốt. Việc phải làm việc với nhiều Graphic Resource nói chung hay image nói riêng luôn đòi hỏi một ứng dụng làm việc với hiệu suất cao, vậy nên chúng ta luôn tìm cách để tối ưu hóa chúng bằng những kỹ thuật, những thủ thuật cần thiết để ứng dụng luôn được mượt mà.

Các kỹ thuật Load Bitmap Efficently

Load Scale Down Bitmap

Như đã dẫn nhập ở trên, trong một số trường hợp cụ thể, ví dụ như load ảnh ở dạng Thumbnail, bạn chỉ cần một bức ảnh với kích thước 64x64 để có thể hiển thị ở dạng grid view. Tuy nhiên, server lưu ảnh ở một độ phân giải cao gấp nhiều lần, ví dụ như 1024x1024. Vấn đề ở đây, bạn chỉ cần hiển thị một ảnh ở độ phân giải thấp, không lẽ bạn phải decode một cái ảnh với độ phân giải cao gấp nhiều lần, điều đó chỉ làm tốn nhiều tài nguyên hệ thống và dễ dàng làm overload bộ nhớ của bạn ( chúng ta hay biết đến với cái tên OutOfMemory Exception) mà kết quả mang lại cho bạn thì không có gì thay đổi. Kỹ thuật Load Scale Down Bitmap ra đời để giải bài toán này. Chúng ta cùng tìm hiểu xem nhé.

Chúng ta cần xem xét một số khía cạnh sau đây.

  • Memory Usage sẽ được sử dụng để load toàn bộ ảnh gốc.
  • Memory Usage sẽ được sử dụng để load ảnh với độ phân giải vừa đủ theo yêu cầu.
  • Dimension của component sẽ sử dụng Bitmap này. Ví dụ ImageView …
  • Screen size và density của màn hình sẽ hiển thị.

Ví dụ nhé, bạn cần load một ảnh với kích thước 1024x1024 từ server về và decode nó thì lượng memory usage bạn cần để decode ảnh này là khoảng 4MB. Tuy nhiên, nếu bạn chỉ cần một ảnh vừa đủ với độ phân giải là 96x96 để load vào một ImageView có kích thước 48dp x 48dp ở màn hình xhdpi, lương memory usage bạn cần chỉ khoảng 36KB. Rõ ràng, sự chênh lệch là rất lớn.

Android cung cấp cho chúng ta một thuộc tính trong BitmapFactory.Options gọi là inSampleSize. Để hiểu rõ hơn về thuộc tính này, chúng ta có một ví dụ. Một bức ảnh có độ phân giải 1024x1024 nếu được decode với inSampleSize = 8 thì sẽ tạo ra một Bitmap có size sấp xỉ bằng 128x128. Như vậy, bạn đã hình dung ra thuộc tính inSampleSize này làm gì rồi chứ??             </div>
            
            <div class=

0