Tránh tải xuống khi chưa được tối ưu hoá

Một số người dùng ứng dụng của bạn có thể truy cập Internet không liên tục hoặc có giới hạn về lượng thông tin mà họ có thể tải xuống thiết bị. Bạn có thể khuyến khích người dùng tương tác với ứng dụng của bạn thường xuyên hơn bằng cách giảm lượng dữ liệu mà ứng dụng cần tải xuống.

Cách cơ bản nhất để giảm số lượt tải xuống là chỉ tải xuống những nội dung bạn cần. Về dữ liệu, điều đó có nghĩa là bạn phải triển khai các API REST cho phép bạn chỉ định tiêu chí truy vấn để giới hạn dữ liệu được trả về bằng cách sử dụng các tham số như thời gian cập nhật gần đây nhất.

Tương tự, khi tải hình ảnh xuống, bạn nên giảm kích thước hình ảnh phía máy chủ thay vì tải hình ảnh có kích thước đầy đủ xuống rồi giảm kích thước trên máy khách.

Lưu phản hồi HTTP vào bộ nhớ đệm

Một kỹ thuật quan trọng khác là tránh tải dữ liệu trùng lặp xuống. Bạn có thể giảm khả năng tải cùng một phần dữ liệu xuống nhiều lần bằng cách sử dụng tính năng lưu vào bộ nhớ đệm. Bằng cách lưu vào bộ nhớ đệm dữ liệu và tài nguyên của ứng dụng, bạn sẽ tạo một bản sao cục bộ của thông tin mà ứng dụng cần tham chiếu. Nếu ứng dụng của bạn cần truy cập vào cùng một thông tin nhiều lần trong một khoảng thời gian ngắn, bạn chỉ cần tải thông tin đó xuống bộ nhớ đệm một lần.

Bạn cần lưu vào bộ nhớ đệm một cách tích cực nhất có thể để giảm tổng lượng dữ liệu mà bạn tải xuống. Luôn lưu vào bộ nhớ đệm các tài nguyên tĩnh, bao gồm cả nội dung tải xuống theo yêu cầu (chẳng hạn như hình ảnh có kích thước đầy đủ) trong thời gian dài nhất có thể. Bạn nên lưu trữ riêng các tài nguyên theo yêu cầu để có thể thường xuyên xoá bộ nhớ đệm theo yêu cầu nhằm quản lý kích thước của bộ nhớ đệm này.

Để đảm bảo rằng hoạt động lưu vào bộ nhớ đệm không khiến ứng dụng của bạn hiển thị dữ liệu cũ, hãy sử dụng các mã trạng thái và tiêu đề HTTP thích hợp, chẳng hạn như tiêu đề ETagLast-Modified. Nhờ đó, bạn có thể xác định thời điểm cần làm mới nội dung được liên kết. Ví dụ:

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

Bạn có thể định cấu hình một số thư viện mạng để tự động tuân thủ các mã trạng thái và tiêu đề này. Ví dụ: khi sử dụng OkHttp, việc định cấu hình một thư mục lưu vào bộ nhớ đệm và kích thước bộ nhớ đệm cho ứng dụng sẽ cho phép thư viện sử dụng tính năng lưu vào bộ nhớ đệm HTTP, như minh hoạ trong mẫu mã sau:

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

Khi đã định cấu hình bộ nhớ đệm, bạn có thể phân phát các yêu cầu HTTP được lưu hoàn toàn vào bộ nhớ đệm ngay từ bộ nhớ cục bộ, loại bỏ nhu cầu mở kết nối mạng. Các phản hồi được lưu vào bộ nhớ đệm có điều kiện có thể xác thực độ mới của chúng từ máy chủ, loại bỏ chi phí băng thông liên quan đến việc tải xuống. Các phản hồi chưa được lưu vào bộ nhớ đệm sẽ được lưu trữ trong bộ nhớ đệm phản hồi cho các yêu cầu trong tương lai.

Bạn có thể lưu dữ liệu không nhạy cảm vào bộ nhớ đệm ngoài không được quản lý bằng cách sử dụng Context.getExternalCacheDir(). Ngoài ra, bạn có thể lưu dữ liệu vào bộ nhớ đệm ứng dụng được quản lý và bảo mật bằng cách sử dụng Context.getCacheDir(). Xin lưu ý rằng bộ nhớ đệm nội bộ này có thể bị xoá khi hệ thống sắp hết dung lượng bộ nhớ trống.

Dùng kho lưu trữ

Để có một phương pháp lưu vào bộ nhớ đệm tinh vi hơn, hãy cân nhắc mẫu thiết kế Kho lưu trữ. Việc này bao gồm việc tạo một lớp tuỳ chỉnh (được gọi là Kho lưu trữ) cung cấp một bản tóm tắt API đối với một số dữ liệu hoặc tài nguyên cụ thể. Ban đầu, kho lưu trữ có thể tìm nạp dữ liệu từ nhiều nguồn, chẳng hạn như một dịch vụ web từ xa, nhưng sẽ cung cấp cho người gọi phiên bản dữ liệu được lưu vào bộ nhớ đệm trong các lệnh gọi tiếp theo. Lớp gián tiếp này cho phép bạn cung cấp một chiến lược lưu vào bộ nhớ đệm mạnh mẽ dành riêng cho ứng dụng của bạn. Để biết thêm thông tin về cách sử dụng mẫu Kho lưu trữ trong ứng dụng, hãy xem Hướng dẫn về cấu trúc ứng dụng.