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ó quyền truy cập Internet không ổn định hoặc bị giới hạn lượng thông tin họ có thể tải xuống thiết bị của mình. 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 số lượng mà ứng dụng của bạn 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 những nội dung bạn của bạn. Về mặt dữ liệu, điều đó có nghĩa là việc 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 điểm cập nhật lần cuối.

Tương tự, khi tải xuống hình ảnh, bạn nên giảm kích thước của hình ảnh ở phía máy chủ, thay vì tải xuống hình ảnh có kích thước đầy đủ được thu nhỏ 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 xuống cùng một phần dữ liệu nhiều lần bằng cách sử dụng lưu vào bộ nhớ đệm. Bằng cách lưu dữ liệu và tài nguyên của ứng dụng vào bộ nhớ đệm, bạn tạo một bản sao cục bộ của thông tin mà ứng dụng của bạn cần tham khảo. Nếu ứng dụng của bạn cần truy cập cùng một thông tin nhiều lần trong một khoảng thời gian ngắn, thì bạn cần để chỉ tải xuống bộ nhớ đệm một lần.

Bạn cần lưu vào bộ nhớ đệm nhiều nhất có thể để giảm tổng số lượng dữ liệu bạn tải xuống. Luôn lưu các tài nguyên tĩnh vào bộ nhớ đệm, bao gồm tải xuống theo yêu cầu, chẳng hạn như hình ảnh có kích thước đầy đủ, miễn là hợp lý nhất có thể. Tài nguyên theo yêu cầu phải được lưu trữ riêng để cho phép bạn thường xuyên xoá bộ nhớ đệm theo yêu cầu để quản lý kích thước của bộ nhớ đệm.

Để đảm bảo rằng việc lưu vào bộ nhớ đệm không dẫn đến việc ứng dụng hiển thị dữ liệu cũ, hãy sử dụng mã trạng thái HTTP và tiêu đề, chẳng hạn như ETagLast-Modified . Điều này cho phép bạn xác định khi nào nội dung liên quan nên được đã làm mới. 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 để tuân theo các mã trạng thái này và tự động. Khi sử dụng OkHttp, chẳng hạn như định cấu hình thư mục 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 Lưu vào bộ nhớ đệm của HTTP như trong mã mẫu 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();

Sau khi định cấu hình bộ nhớ đệm, bạn có thể trực tiếp phân phát các yêu cầu HTTP được lưu hoàn toàn vào bộ nhớ đệm từ bộ nhớ cục bộ, nhờ đó không cần 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ủ, giúp loại bỏ chi phí băng thông liên quan đến việc tải xuống. Phản hồi không được lưu vào bộ nhớ đệm đượ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 trong thư mục bộ nhớ đệm bên ngoài không được quản lý bằng cách đang sử dụng Context.getExternalCacheDir(). Ngoài ra, bạn có thể lưu dữ liệu vào bộ nhớ đệm trong bộ nhớ đệm của ứng dụng an toàn và được quản lý bằng cách đang sử dụng Context.getCacheDir(). Lưu ý rằng bộ nhớ đệm nội bộ này có thể bị xoá khi hệ thống sắp hết bộ nhớ còn trống.

Sử dụng kho lưu trữ

Đối với phương pháp lưu vào bộ nhớ đệm tinh vi hơn, hãy cân nhắc thiết kế Kho lưu trữ . Việc này liên quan đến việc tạo một lớp tuỳ chỉnh, được gọi là Kho lưu trữ, cung cấp bản tóm tắt API trên một số dữ liệu hoặc tài nguyên cụ thể. Kho lưu trữ ban đầu có thể tìm nạp dữ liệu từ nhiều nguồn khác nhau như dịch vụ web từ xa, nhưng cung cấp cho phương thức 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. Chiến dịch này 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 của bạn, hãy xem Hướng dẫn về ứng dụng .