Paging
Bảng này liệt kê tất cả cấu phần phần mềm trong nhóm androidx.paging.
| Cấu phần phần mềm | Bản phát hành ổn định | Bản phát hành dùng thử | Bản phát hành beta | Bản phát hành alpha |
|---|---|---|---|---|
| paging-* | 3.3.6 | - | - | 3.4.0-alpha04 |
| paging-compose | 3.3.6 | - | - | 3.4.0-alpha04 |
Khai báo phần phụ thuộc
Để thêm một phần phụ thuộc trên Paging, bạn phải thêm kho lưu trữ Google Maven vào dự án. Đọc nội dung Kho lưu trữ Maven của Google để biết thêm thông tin.
Thêm các phần phụ thuộc cho cấu phần phần mềm mà bạn cần trong tệp build.gradle cho ứng dụng hoặc mô-đun:
Groovy
dependencies { def paging_version = "3.3.6" implementation "androidx.paging:paging-runtime:$paging_version" // alternatively - without Android dependencies for tests testImplementation "androidx.paging:paging-common:$paging_version" // optional - RxJava2 support implementation "androidx.paging:paging-rxjava2:$paging_version" // optional - RxJava3 support implementation "androidx.paging:paging-rxjava3:$paging_version" // optional - Guava ListenableFuture support implementation "androidx.paging:paging-guava:$paging_version" // optional - Jetpack Compose integration implementation "androidx.paging:paging-compose:3.4.0-alpha04" }
Kotlin
dependencies { val paging_version = "3.3.6" implementation("androidx.paging:paging-runtime:$paging_version") // alternatively - without Android dependencies for tests testImplementation("androidx.paging:paging-common:$paging_version") // optional - RxJava2 support implementation("androidx.paging:paging-rxjava2:$paging_version") // optional - RxJava3 support implementation("androidx.paging:paging-rxjava3:$paging_version") // optional - Guava ListenableFuture support implementation("androidx.paging:paging-guava:$paging_version") // optional - Jetpack Compose integration implementation("androidx.paging:paging-compose:3.4.0-alpha04") }
Để biết thông tin về cách sử dụng các phần mở rộng Kotlin, hãy xem tài liệu ktx.
Để biết thêm thông tin về các phần phụ thuộc, hãy xem bài viết Thêm phần phụ thuộc của bản dựng.
Ý kiến phản hồi
Ý kiến phản hồi của bạn có thể giúp chúng tôi cải thiện Jetpack. Hãy cho chúng tôi biết nếu bạn phát hiện lỗi mới hoặc có ý tưởng cải thiện thư viện này. Vui lòng xem các lỗi hiện có trong thư viện này trước khi báo một lỗi mới. Bạn có thể thêm lượt bình chọn cho lỗi hiện có bằng cách nhấp vào nút dấu sao.
Xem tài liệu về Công cụ theo dõi lỗi để biết thêm thông tin.
Phiên bản 3.4
Phiên bản 3.4.0-alpha04
Ngày 10 tháng 9 năm 2025
Phát hành androidx.paging:paging-*:3.4.0-alpha04. Phiên bản 3.4.0-alpha04 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm một API
PagingStatemớiclosestItemAroundPositionđể truy xuất mục đã tải gần với vị trí mục tiêu nhất và khớp với vị từ đầu vào. Bạn có thể dùng tham số này để tạo các khoá làm mới dựa trên mục, trong đó mục có thể neo lý tưởng nằm xung quanh nhưng không ở vị trí mục tiêu chính xác. (I96e5c, b/440187139)
Phiên bản 3.4.0-alpha03
Ngày 27 tháng 8 năm 2025
Phát hành androidx.paging:paging-*:3.4.0-alpha03. Phiên bản 3.4.0-alpha03 bao gồm các thay đổi sau.
Tính năng mới
- Paging-common đã thêm máy tính làm mục tiêu Kotlin Multiplatform (KMP) mới. Tổng cộng, Kotlin hiện hỗ trợ JVM(Android và máy tính), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) và Web (JavaScript, WasmJS). (Id2483, b/436884811)
- Paging-testing đã thêm các mục tiêu Kotlin Multiplatform (KMP) mới. Tổng cộng, Kotlin hiện hỗ trợ JVM(Android và máy tính), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) và Web (JavaScript, WasmJS). (I0c543, b/435014650)
- Paging-compose đã thêm các mục tiêu Kotlin Multiplatform (KMP) mới. Tổng cộng, Kotlin hiện hỗ trợ JVM(Android và máy tính), Native (Linux, iOS, watchOS, tvOS, macOS, MinGW) và Web (JavaScript, WasmJS). (I70d44, b/436884801)
Thay đổi về API
- Di chuyển minSdk mặc định từ API 21 sang API 23 (Ibdfca, b/380448311, b/435705964, b/435705223)
Phiên bản 3.4.0-alpha02
Ngày 30 tháng 7 năm 2025
Phát hành androidx.paging:paging-*:3.4.0-alpha02. Phiên bản 3.4.0-alpha02 bao gồm các thay đổi sau.
Thay đổi về API
PagingData.fromhiện cho phép thiết lậpplaceholdersBeforevàplaceholdersAfter. Xin lưu ý rằng việc di chuyển qua các phần giữ chỗ này sẽ không kích hoạt quá trình tải. (I06983)
Phiên bản 3.4.0-alpha01
Ngày 2 tháng 7 năm 2025
Phát hành androidx.paging:paging-*:3.4.0-alpha01. Phiên bản 3.4.0-alpha01 bao gồm các thay đổi sau.
Tính năng mới
- Phân trang đã thêm các mục tiêu KMP sau: watchos, tvos, mingwX64, watchosDeviceArm64 và linuxArm64. (I237dd, Ia62b3, b/368046982, Icf15d, b/364652024, I139d3, b/338268719)
Sửa lỗi
- Các kiểm thử đơn vị Android kéo vào Paging 3.3 trở lên sẽ không còn gặp lỗi
PagingLoggernữa (Ia9400, b/331684448) - Khắc phục lỗi
RecyclerViewgửiIndexOutOfBoundsExceptionkhi người dùng cuộn trong khi cập nhậtRecyclerView(Id1f16, b/381024738) - Khắc phục lỗi khiến tính năng phân trang không thể kích hoạt thêm lượt tải khi làm mới trong lúc cuộn. (I60ca5, b/352586078)
- Khắc phục sự cố khi cuộn trong lúc làm mới các mục Phân trang. (I8c65a, b/347649763)
Phiên bản 3.3
Phiên bản 3.3.6
Ngày 12 tháng 2 năm 2025
Phát hành androidx.paging:paging-*:3.3.6. Phiên bản 3.3.6 bao gồm các thay đổi sau.
Sửa lỗi
- Các tín hiệu Làm mới và thử lại được gửi trong quá trình Làm mới ban đầu sẽ được lưu trữ và tự động gửi lại sau khi Trình bày phân trang sẵn sàng.
Đóng góp bên ngoài
Phiên bản 3.3.5
Ngày 11 tháng 12 năm 2024
Phát hành androidx.paging:paging-*:3.3.5. Phiên bản 3.3.5 bao gồm các thay đổi sau.
Sửa lỗi
- Khắc phục lỗi
RecyclerViewgửiIndexOutOfBoundsExceptionkhi người dùng cuộn trong khi cập nhậtRecyclerView. (Id1f16, b/381024738)
Phiên bản 3.3.4
Ngày 13 tháng 11 năm 2024
Phát hành androidx.paging:paging-*:3.3.4. Phiên bản 3.3.4 bao gồm các thay đổi sau.
Sửa lỗi
- Các kiểm thử đơn vị Android kéo Paging 3.3 trở lên sẽ không còn gây ra lỗi như
Method isLoggable in android.util.Log not mockednữa. (Ia9400, b/331684448)
Phiên bản 3.3.2
Ngày 7 tháng 8 năm 2024
Phát hành androidx.paging:paging-*:3.3.2. Phiên bản 3.3.2 bao gồm các thay đổi sau.
Tính năng mới
paging-commonvàpaging-testingđã thêm các mục tiêu Kotlin Multiplatform mới:watchos,tvosvàlinuxArm64(90c9768), (53e0eca)
Phiên bản 3.3.1
Ngày 24 tháng 7 năm 2024
Phát hành androidx.paging:paging-*:3.3.1. Phiên bản 3.3.1 bao gồm các thay đổi sau.
Sửa lỗi
- Khắc phục vấn đề khiến
AsyncPagingDataDifferhoặc các API được xây dựng trên đó (chẳng hạn nhưPagingDataAdapterdùng vớiRecyclerView) không thể kích hoạt thêm lượt tải khi nguồn dữ liệu hỗ trợ được làm mới trong khi người dùng cuộn. (I60ca5, b/352586078) - Khắc phục sự cố xảy ra khi các mục bị xoá khỏi nguồn dữ liệu hỗ trợ trong khi cuộn
RecyclerViewbằngPagingDataAdapterhoặcAsyncPagingDataDiffer. (I8c65a, b/347649763)
Phiên bản 3.3.0
Ngày 14 tháng 5 năm 2024
Phát hành androidx.paging:paging-*:3.3.0. Phiên bản 3.3.0 bao gồm các thay đổi sau.
Thay đổi quan trọng kể từ phiên bản 3.2.0
PagingDataPresenterhiện là một lớp công khai. Giờ đây, bạn có thể tạo các trình bày đa nền tảng dựa trênPagingDataPresenterthay vì yêu cầu các API Phân trang nội bộ hoặcAsyncPagingDataDiffercủapaging-runtime.- Thêm các phương thức trợ giúp
LoadStatesvàCombinedLoadStatesmới tronghasErrorvàisIdleđể kiểm tra xemLoadStatescó ở trạng thái Lỗi hayNotLoadinghay không. Ngoài ra, chúng tôi cũng đã thêm một phương thức mở rộng KotlinawaitNotLoading()mới trênFlow<CombinedLoadStates>. Phương thức này sẽ đợi cho đến khi quá trình tải hoàn tất ở trạng tháiNotLoadinghoặc Lỗi. - Theo mặc định,
PagingData.empty()hiện sẽ điều phối các trạng tháiNotLoading, trừ phiLoadStatestuỳ chỉnh được truyền đến hàm khởi tạo của nó. Điều này khác với hành vi hiện tại là không gửiLoadStateskhi được gửi đếnPagingDataAdapterhoặc gửi trạng thái Đang tải khi được thu thập dưới dạngLazyPagingItems. Khi được thu thập dưới dạngLazyPagingItems, danh sách này cũng sẽ hiển thị một danh sách trống ngay khi kết hợp ban đầu.
Khả năng tương thích của Kotlin Multiplatform
Paging hiện cung cấp các cấu phần phần mềm tương thích với Kotlin Multiplatform, phần lớn là nhờ công việc được chuyển lên từ dự án multiplatform-paging của CashApp.
paging-commonđã di chuyển tất cả các API Paging 3 sangcommonvà hiện tương thích với jvm và iOS ngoài Android.paging-testingđã chuyển mã của mình sangcommonvà hiện tương thích với jvm và iOS ngoài Android.paging-composeđã chuyển mã của mình sangcommonvà cung cấp một cấu phần phần mềm Android, phù hợp với khả năng hỗ trợ đa nền tảng củaandroidx.compose.paging-runtime,paging-guava,paging-rxjava2vàpaging-rxjava3sẽ chỉ có trên Android.
Phiên bản 3.3.0-rc01
Ngày 1 tháng 5 năm 2024
androidx.paging:paging-*:3.3.0-rc01 được phát hành mà không có thay đổi nào trong Paging 3.3.0-beta01. Phiên bản 3.3.0-rc01 bao gồm các thay đổi sau.
Phiên bản 3.3.0-beta01
Ngày 3 tháng 4 năm 2024
Phát hành androidx.paging:paging-*:3.3.0-beta01 mà không có thay đổi đáng kể nào. Phiên bản 3.3.0-beta01 bao gồm các thay đổi sau.
Phiên bản 3.3.0-alpha05
Ngày 20 tháng 3 năm 2024
Phát hành androidx.paging:paging-*:3.3.0-alpha05. Phiên bản 3.3.0-alpha05 bao gồm các thay đổi sau.
Thay đổi về API
- Paging hiện sử dụng chú giải
@MainThreadcủa AndroidX Annotation cho mã chung. (I78f0d, b/327682438)
Phiên bản 3.3.0-alpha04
Ngày 6 tháng 3 năm 2024
Phát hành androidx.paging:paging-*:3.3.0-alpha04. Phiên bản 3.3.0-alpha04 bao gồm các thay đổi sau.
Sửa lỗi
- Khắc phục các lỗi nhỏ trong tài liệu liên quan đến việc bổ sung khả năng tương thích đa nền tảng Kotlin. (aosp/2950785)
Phiên bản 3.3.0-alpha03
Ngày 7 tháng 2 năm 2024
Phát hành androidx.paging:paging-*:3.3.0-alpha03. Phiên bản 3.3.0-alpha03 bao gồm các thay đổi sau.
Tính năng mới
PagingDataPresenterhiện là một lớp công khai. Giờ đây, bạn có thể tạo các trình bày đa nền tảng dựa trênPagingDataPresenterthay vì yêu cầu các API Phân trang nội bộ hoặcAsyncPagingDataDiffercủapaging-runtime. (Id1f74, b/315214786)- Thêm các phương thức trợ giúp
LoadStatesvàCombinedLoadStatesmới để kiểm tra xemLoadStatescó ở trạng thái Lỗi hayNotLoadinghay không. Đồng thời, chúng tôi cũng đã thêm một API mới chờ trênLoadStateFlowcho đến khi quá trình tải hoàn tất ở trạng tháiNotLoadinghoặc Lỗi. (Id6c67)
Thay đổi về hành vi
- Theo mặc định,
PagingData.empty()hiện sẽ điều phối các trạng tháiNotLoading, trừ phiLoadStatestuỳ chỉnh được truyền đến hàm khởi tạo của nó. Điều này khác với hành vi hiện tại là không gửiLoadStateskhi được gửi đếnPagingDataAdapterhoặc gửi trạng thái Đang tải khi được thu thập dưới dạngLazyPagingItems. Khi được thu thập dưới dạngLazyPagingItems, danh sách này cũng sẽ hiển thị một danh sách trống ngay khi kết hợp ban đầu. (I4d11d, b/301833847)
Phiên bản 3.3.0-alpha02
Ngày 20 tháng 9 năm 2023
Phát hành androidx.paging:paging-*:3.3.0-alpha02. Phiên bản 3.3.0-alpha02 bao gồm các thay đổi sau.
Khả năng tương thích của Kotlin Multiplatform
Paging hiện cung cấp các cấu phần phần mềm tương thích với Kotlin Multiplatform, phần lớn là nhờ công việc được chuyển lên từ dự án multiplatform-paging của CashApp. Điều này sẽ giúp chúng ta tránh được sự khác biệt giữa hai kho lưu trữ và đảm bảo chúng tương thích với nhau.
paging-commonđã di chuyển tất cả các API Paging 3 sangcommonvà hiện tương thích với jvm và iOS ngoài Android.paging-testingđã chuyển mã của mình sangcommonvà hiện tương thích với jvm và iOS ngoài Android.paging-composeđã chuyển mã của mình sangcommonvà cung cấp một cấu phần phần mềm Android, phù hợp với khả năng hỗ trợ đa nền tảng củaandroidx.compose.paging-runtime,paging-guava,paging-rxjava2vàpaging-rxjava3sẽ chỉ có trên Android.
Thay đổi về API
- Giao diện Logger công khai chỉ dành cho mục đích sử dụng nội bộ đã bị ngừng sử dụng (I16e95, b/288623117)
Đóng góp bên ngoài
- Cảm ơn veyndan của Cash App đã giúp chuyển Paging sang Kotlin Multiplatform (#560, #561, #562, #573, #576, #577, #578, #579, #580, #581, #583, #584, #586, #609)
Phiên bản 3.3.0-alpha01
Ngày 20 tháng 9 năm 2023
- Đây là bản phát hành đa nền tảng đầu tiên của các thư viện androidx.paging. Phiên bản này chỉ có các cấu phần phần mềm
*-jvmvà*-android. Đối với các biến thể macOS, iOS và Linux, hãy sử dụng3.3.0-alpha02.
Phiên bản 3.2
Phiên bản 3.2.1
Ngày 6 tháng 9 năm 2023
Phát hành androidx.paging:paging-*:3.2.1. Phiên bản 3.2.1 bao gồm các thay đổi sau.
Sửa lỗi
- Khắc phục một vấn đề trong đó API
asSnapshot()của cấu phần phần mềm Kiểm thử phân trang sẽ bị treo khi truyền một Flow được tạo bằngPagingData.from(List)vìasSnapshot()sẽ không có thông tin về thời điểm quá trình tải hoàn tất (không giống như phương thức nạp chồngPagingData.from(List, LoadStates)). Giải pháp này chỉ hoạt động đối với các Flow có thể hoàn thành (ví dụ:flowOf(PagingData.from(...))). Đối với các Flow không thể hoàn thành (ví dụ:MutableStateFlow, hãy sử dụng phương thức nạp chồngPagingData.fromcung cấpLoadStates). (I502c3) - Paging Compose hiện sử dụng
AndroidUiDispatcher.Mainnội bộ để đảm bảo rằng dữ liệu mới có sẵn trong cùng một khung hình khi quá trình tải hoàn tất. (Ia55af)
Phiên bản 3.2.0
Ngày 26 tháng 7 năm 2023
Phát hành androidx.paging:paging-*:3.2.0. Phiên bản 3.2.0 bao gồm các thay đổi sau.
Thay đổi quan trọng kể từ phiên bản 3.1.0
- Paging Compose đã đạt đến độ ổn định của API và được hợp nhất trở lại phần còn lại của Paging, trong đó phiên bản của Paging Compose hiện khớp với tất cả các cấu phần phần mềm Paging khác. Các thay đổi kể từ phiên bản 3.1.0 bao gồm:
- Hỗ trợ xem trước danh sách dữ liệu giả bằng cách tạo
PagingData.from(fakeData)và bao bọcPagingDatađó trongMutableStateFlow(ví dụ:MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Truyền luồng này vào các thành phần kết hợp@Previewdưới dạng trình nhận chocollectAsLazyPagingItems()để xem trước. - Hỗ trợ tất cả bố cục lười biếng như
LazyVerticalGridvàHorizontalPagercũng như các thành phần lười biếng tuỳ chỉnh từ thư viện Wear và TV. Việc này được thực hiện thông qua các phương thức mở rộngLazyPagingItemscấp thấp mớiitemKeyvàitemContentType, giúp bạn triển khai các tham sốkeyvàcontentTypecho các APIitemstiêu chuẩn đã có choLazyColumn,LazyVerticalGridcũng như các tham số tương đương trong các API nhưHorizontalPager. items(lazyPagingItems)vàitemsIndexed(lazyPagingItems)chỉ hỗ trợLazyListScopevà đã ngừng hoạt động.
- Hỗ trợ xem trước danh sách dữ liệu giả bằng cách tạo
- Cấu phần phần mềm
paging-testingmới cung cấp các API được thiết kế xoay quanh việc kiểm thử đơn vị từng lớp ứng dụng và việc tích hợp riêng ứng dụng với Paging. Ví dụ: nó bao gồm- Lớp
TestPagercho phép bạn xác thực hành vi của cách triển khaiPagingSourcetuỳ chỉnh của riêng bạn độc lập với Pager và giao diện người dùng thực tế. - API
asPagingSourceFactoryđể chuyển đổiFlow<List<Value>>hoặcList<Value>tĩnh thànhPagingSourceFactorycó thể được truyền đến một Pager trong các chương trình kiểm thử - Tiện ích Kotlin
asSnapshottrênFlow<PagingData<Value>>, giúp chuyểnFlow<PagingData<Value>>thànhList<Value>trực tiếp.asSnapshot lambdacho phép bạn bắt chước giao diện người dùng của ứng dụng thông qua các API nhưscrollTohoặcappendScrollWhileđể bạn có thể xác minh ảnh chụp nhanh của dữ liệu là chính xác ở bất cứ điểm nào trong tập dữ liệu phân trang.
- Lớp
- Đã thêm nhật ký mặc định để hiển thị thông tin gỡ lỗi Paging ở 2 cấp độ:
VERBOSEvàDEBUG. Bạn có thể bật tính năng nhật ký thông qua lệnhadb shell setprop log.tag.Paging [DEBUG|VERBOSE]. Điều này áp dụng cho cả tính năng Phân trang bằng khung hiển thị hoặc Phân trang bằng Compose. - Thêm các hàm dựng cho
PagingDataAdaptervàAsyncPagingDataDifferchấp nhậnCoroutineContextthay vìCoroutineDispatcher. - Thêm một giao diện chức năng
PagingSourceFactorymới cung cấp một khu vực API rõ ràng hơn so với các lambda () ->PagingSourcetrước đó. Bạn có thể dùng phương thức khởi tạo này để khởi tạo một Pager.
Phiên bản 3.2.0-rc01
Ngày 21 tháng 6 năm 2023
Phát hành androidx.paging:paging-*:3.2.0-rc01. Phiên bản 3.2.0-rc01 bao gồm các thay đổi sau.
Đóng góp bên ngoài
- Cảm ơn Veyndan đã đóng góp vào việc di chuyển Phân trang khỏi các thông số kỹ thuật của Android/JVM. (#553, #554, #555, #559)
Phiên bản 3.2.0-beta01
Ngày 7 tháng 6 năm 2023
Phát hành androidx.paging:paging-*:3.2.0-beta01. Phiên bản 3.2.0-beta01 bao gồm các thay đổi sau.
Paging Compose
- Thư viện Phân trang của Compose đã chính thức đạt đến độ ổn định của API. Do đó, phiên bản này đã được cập nhật từ
1.0.0-alpha20để khớp với phiên bản của tất cả các cấu phần phần mềm Phân trang khác.
Thay đổi về API
- Xoá các API
items(LazyPagingItems)vàitemsIndexed(LazyPagingItems)không dùng nữa khỏi Paging Compose. Hãy xem ghi chú phát hành Paging Compose1.0.0-alpha20để biết ví dụ về các API thay thế. (I9626e)
Phiên bản 3.2.0-alpha06
Ngày 24 tháng 5 năm 2023
Phát hành androidx.paging:paging-*:3.2.0-alpha06. Phiên bản 3.2.0-alpha06 bao gồm các thay đổi sau.
Tính năng mới
- Thêm giao diện chức năng
PagingSourceFactorymới cung cấp một giao diện API rõ ràng hơn so với các hàm lambda() -> PagingSourcehiện có. Bạn có thể dùng nhà máy này để tạo mộtPager. (I33165, b/280655188) - Thêm API
paging-testingmới củaList<Value>.asPagingSourceFactory()để nhậnPagingSourceFactorychỉ tải từ danh sách dữ liệu bất biến. Bạn vẫn nên sử dụng tiện ích hiện có trênFlow<List<Value>>để kiểm thử với nhiều thế hệ dữ liệu tĩnh. (Id34d1, b/280655188)
Thay đổi về API
- Tất cả các API công khai trong tính năng phân trang-kiểm thử hiện được chú thích bằng
@VisibleForTestingđể đảm bảo các API này chỉ được dùng trong các kiểm thử. (I7db6e) - API
asSnapshotkhông còn yêu cầu truyền vào mộtCoroutineScopenữa. Giờ đây, theo mặc định, nó sẽ sử dụng ngữ cảnh được kế thừa từ phạm vi mẹ. (Id0a78, b/282240990) - Sắp xếp lại các tham số hàm khởi tạo
TestPagerđể khớp một cách trực quan với thứ tự của các tham số hàm khởi tạoPagerthực (I6185a) - Đã di chuyển việc sử dụng loại lambda
() -> PagingSource<Key, Value>của tính năng kiểm thử phân trang sang loạiPagingSourceFactory<Key, Value>. (I4a950, b/280655188)
Thay đổi về hành vi
- Bạn không cần trình điều phối chính để chạy các kiểm thử Phân trang
asSnapshotnữa. Việc đặt giá trị này sẽ không còn làm thay đổi hành vi kiểm thử nữa. (Ie56ea)
Phiên bản 3.2.0-alpha05
Ngày 3 tháng 5 năm 2023
Phát hành androidx.paging:paging-*:3.2.0-alpha05. Phiên bản 3.2.0-alpha05 bao gồm các thay đổi sau.
Thay đổi về API
- API Kiểm thử phân trang của
asSnapshothiện đặt tham sốloadOperationstheo mặc định thành một hàm lambda trống. Điều này cho phép gọiasSnapshotmà không cần truyền bất kỳ thao tác tải nào để truy xuất dữ liệu từ lần tải làm mới ban đầu. (Ied354, b/277233770)
Cải thiện tài liệu
- Cập nhật tài liệu về
asPagingSourceFactory()để làm rõ rằng đây là một phương thức tiện ích trênFlow, trả về một phương thức tạo có thể dùng lại để tạo các thực thểPagingSource. (I5ff4f, I705b5) - Cập nhật tài liệu về hàm khởi tạo
LoadResult.Pageđể làm rõ nhu cầu ghi đèitemsBeforevàitemsAfterđể hỗ trợ tính năng nhảy. (Ied354)
Đóng góp bên ngoài
- Cảm ơn Veyndan đã đóng góp vào việc di chuyển Phân trang khỏi các thông số kỹ thuật của Android/JVM. (#525, #523, #520, #519, #507, #506, #505, #499, #497, #496, #493)
Phiên bản 3.2.0-alpha04
Ngày 8 tháng 2 năm 2023
Phát hành androidx.paging:paging-*:3.2.0-alpha04. Phiên bản 3.2.0-alpha04 bao gồm các thay đổi sau.
Kiểm thử Paging
- Cấu phần phần mềm
paging-testinghiện chứa một phương thứcasPagingSourceFactoryđể tạopagingSourceFactorytừFlow<List<Value>>được cung cấp cho Trình chuyển trang. MỗiList<Value>>được tạo ra từ Flow (Luồng) đại diện cho một lượt tạo dữ liệu được phân trang. Việc này tạo điều kiện thuận lợi cho các lượt kiểm thử phân trang, chẳng hạn như khi chuyển đổiPagingDatabằng cách tạo ra một nguồn dữ liệu để Trình chuyển trang thu thập dữ liệu. (I6f230, b/235528239) Cấu phần phần mềm
paging-testingđã được mở rộng bằng các API mới phù hợp để xác minh dữ liệu có trongFlow<PagingData<T>>là chính xác. Ví dụ: bạn có thể sử dụng cấu phần phần mềm này để xác nhận đầu ra củaFlow<PagingData<T>>từ lớp ViewModel.Bạn có thể thực hiện việc này qua tiện ích Kotlin
asSnapshottrênFlow<PagingData<Value>>, giúp chuyểnFlow<PagingData<Value>>thànhList<Value>trực tiếp. Hàm lambdaasSnapshotgiúp bạn bắt chước giao diện người dùng của ứng dụng thông qua các API nhưscrollTohoặcappendScrollWhiletheo cách có thể lặp lại và nhất quán để bạn có thể xác minh ảnh chụp nhanh của dữ liệu là chính xác ở bất cứ điểm nào trong tập dữ liệu phân trang.// Create your ViewModel instance val viewModel = … // Get the Flow of PagingData from the ViewModel val data< Flow<PagingData<String>> = viewModel.data val snapshot: List<String> = data.asSnapshot { // Each operation inside the lambda waits for the data to settle before continuing scrollTo(index = 50) // While you can’t view the items within the asSnapshot call, // you can continuously scroll in a direction while some condition is true // i.e., in this case until you hit a placeholder item appendScrollWhile { item: String -> item != “Header 1” } } // With the asSnapshot complete, you can now verify that the snapshot // has the expected valuesasSnapshotlà một phương thứcsuspenddự kiến sẽ chạy trongrunTest. Hãy xem bài viết Kiểm thử coroutine của Kotlin trên Android để biết thêm thông tin. (I55fd2, I5bd26, I7ce34, I51f4d, I2249f, Id6223, Ic4bab, Ib29b9, Ic1238, I96def, b/235528239)
Các thay đổi về API
- Các lệnh gọi giao diện người dùng đến
getItemvàpeektrongAsyncPagingDataDiffervàPagingDataAdapterhiện được đánh dấu chính xác là chỉ có thể gọi trên Luồng chính. (I699b6) - Xoá ký tự đại diện khỏi các loại chung được
TestPagersử dụng, giúp bạn dễ dàng dùng kết quả của các phương thức đó trong mã viết bằng ngôn ngữ lập trình Java. (I56c42)
Phiên bản 3.2.0-alpha03
Ngày 24 tháng 10 năm 2022
Phát hành androidx.paging:paging-*:3.2.0-alpha03. Phiên bản 3.2.0-alpha03 bao gồm các thay đổi sau.
Kiểm thử Paging
Bản phát hành này chứa một cấu phần phần mềm mới: paging-testing. Cấu phần phần mềm này cung cấp các API được thiết kế xoay quanh việc kiểm thử đơn vị từng lớp ứng dụng và việc tích hợp riêng ứng dụng với Paging.
Ví dụ: bản phát hành đầu tiên này bao gồm một lớp TestPager cho phép bạn xác thực hành vi của cách triển khai PagingSource tuỳ chỉnh của riêng bạn độc lập với Pager và giao diện người dùng thực tế mà bạn thường cần để mô phỏng quá trình tích hợp Paging từ đầu đến cuối.
TestPager phải được coi là giả – một quy trình kiểm thử kép phản ánh cách triển khai thực tế của Pager, đồng thời cung cấp nền tảng API đã đơn giản hoá để kiểm thử PagingSource. Các API này là các API suspend và bạn nên chạy trong runTest như đã nêu trong hướng dẫn Kiểm thử coroutine của Kotlin trên Android.
Bạn có thể xem ví dụ về các API này đang được dùng trong các chương trình kiểm thử room-paging. Các API này được tái cấu trúc để sử dụng TestPager.
Các thay đổi về API
- Cho phép lặp lại thuận tiện qua
LoadResult.Page.datađếnLoadResult.Page.iterator(). Điều này gián tiếp cho phép sử dụng phương thứcflattencho thư viện chuẩn Kotlin khi được cung cấpList<LoadResult.Page>, chẳng hạn như với thuộc tínhpagescủaPagingStateđược truyền đến phương thứcPagingSource.getRefreshKey. (Ie0718)
Phiên bản 3.2.0-alpha02
Ngày 10 tháng 8 năm 2022
Phát hành androidx.paging:paging-*:3.2.0-alpha02. Phiên bản 3.2.0-alpha02 bao gồm các thay đổi sau.
Tính năng mới
- Paging hiện cung cấp nhật ký thông qua các lớp
AsyncPagingDataDifferhoặcPagingDataAdapterđể hiển thị thông tin gỡ lỗi được thu thập từPagingData. - Bạn có thể bật tính năng nhật ký thông qua lệnh
adb shelladb shell setprop log.tag.Paging [DEBUG|VERBOSE].(b/235527159)
Sửa lỗi
- Khắc phục lỗi thiếu hàm khởi tạo
PagingDataDifferkhi sử dụngpaging-common:3.2.0-alpha01với thời gian chạypaging-runtime:3.1.1trở về trước.(b/235256201)
Phiên bản 3.2.0-alpha01
Ngày 1 tháng 6 năm 2022
Phát hành androidx.paging:paging-*:3.2.0-alpha01. Phiên bản 3.2.0-alpha01 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm các hàm dựng cho
PagingDataAdaptervàAsyncPagingDataDifferchấp nhậnCoroutineContextthay vìCoroutineDispatcher. (Idc878) - Theo mặc định,
PagingData.from()vàPagingData.empty()sẽ không còn ảnh hưởng đếnCombinedLoadStatesở phía người trình bày. Quá tải mới cho phép truyềnsourceLoadStatesvàremoteLoadStatesvào các hàm dựng đã được thêm vào này để duy trì hành vi hiện tại của việc đặtLoadStatesthành thiết bị đầu cuối hoàn toàn (tức làNotLoading(endOfPaginationReached = false)), với tùy chọn bao gồm các trạng thái từ xa nếu cần. NếuLoadStateskhông được truyền, thìCombinedLoadStatestrước đó sẽ được duy trì ở phía người trình bày khi nó nhận đượcPagingDatatĩnh. (Ic3ce5, b/205344028)
Sửa lỗi
- Kết quả của
PagingSource.getRefreshKey()hiện đã được đánh giá chính xác trêninitialKeytrong trường hợp trả về giá trị null, nhưng mộtinitialKeykhông có giá trị null đã được đặt. (Ic9542, b/230391606)
Đóng góp bên ngoài
- Cập nhật :compose:ui:ui-test api (updateApi) do di chuyển test-coroutines-lib (I3366d)
Phiên bản 3.1
Phiên bản 3.1.1
Ngày 9 tháng 3 năm 2022
Phát hành androidx.paging:paging-*:3.1.1. Phiên bản 3.1.1 bao gồm các thay đổi sau.
Sửa lỗi
- Đã xoá các sự kiện
LoadState.NotLoadingtrung gian giữa những thế hệ được.cachedIn()chèn không chính xác. Thay đổi này giúp bạn dễ dàng phản ứng với các thay đổi trênLoadStatebằng cách xoá các sự kiệnLoadState.NotLoadingthừa được tạo ra giữa những lần thử tải lại không thành công khi làm mới hoặc trong trường hợp không hợp lệ.
Phiên bản 3.1.0
Ngày 17 tháng 11 năm 2021
Phát hành androidx.paging:paging-*:3.1.0. Phiên bản 3.1.0 bao gồm các thay đổi sau.
Thay đổi quan trọng kể từ phiên bản 3.0.0
- Các API
Flow<PagingData>.observablevàFlow<PagingData>.flowablekhông còn mang tính thử nghiệm nữa - Các thay đổi về hành vi đối với
LoadState:endOfPaginationReachedhiện tại luôn làfalsetrongLoadType.REFRESHcho cảPagingSourcevàRemoteMediatorLoadStatestừ Paging đang chờ các giá trị hợp lệ từ cảPagingSourcevàRemoteMediatortrước khi phát xuống dưới. Các thế hệPagingDatamới hiện sẽ luôn bắt đầu đúng bằngLoadingđể có trạng thái làm mới thay vì đặt lại về trạng tháiNotLoadingkhông chính xác trong một số trường hợp..loadStateFlowvà.addLoadStateListenertrên API của nội dung trình bày không còn gửi thừaCombinedLoadStatesban đầu khiến các trạng thái dàn xếp luôn được đặt thànhnull
- Việc huỷ các thế hệ trước hiện sẽ xảy ra trong trường hợp không hợp lệ / thế hệ mới. Bạn không cần phải sử dụng
.collectLatesttrênFlow<PagingData>nữa, mặc dù chúng tôi vẫn khuyên bạn nên làm như vậy. PagingSource.LoadResult.Invalidđã được thêm làm loại dữ liệu trả về mới từPagingSource.load, khiến Paging loại bỏ mọi yêu cầu tải đang chờ xử lý hoặc trong tương lai đối vớiPagingSourcenày và vô hiệu hoá nó. Loại dữ liệu trả về này được thiết kế để xử lý dữ liệu có khả năng không hợp lệ hoặc lỗi thời có thể bị trả về từ cơ sở dữ liệu hoặc mạng.- Thêm các API trình bày
.onPagesPresentedvà.addOnPagesUpdatedListenerđã kích hoạt đồng bộ khi các trang được hiển thị trong giao diện người dùng. Việc cập nhật trang có thể xảy ra trong các trường hợp sau:- Lần tải thế hệ PagingData mới đầu tiên sẽ được hoàn tất, bất kể thế hệ mới có bất kỳ thay đổi nào đối với các mục đã được trình bày hay không. tức là Khi thế hệ mới hoàn tất lần tải đầu tiên mà không có nội dung cập nhật nào vì danh sách vẫn giữ nguyên như vậy, thì lệnh gọi lại này vẫn được kích hoạt.
- Một trang sẽ được chèn, ngay cả khi trang được chèn không có mục mới nào.
- Một trang sẽ bị bỏ qua, ngay cả khi trang bị bỏ qua không có mục nào.
Phiên bản 3.1.0-rc01
Ngày 3 tháng 11 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-rc01. Phiên bản 3.1.0-rc01 bao gồm các thay đổi sau.
Sửa lỗi
- Sửa một điều kiện thực hiện + rò rỉ bộ nhớ trong .cachedIn() trong trường hợp nhiều sự kiện tải được gửi đi bởi Paging tiếp theo trong khi không có các nội dung ghi nhận nào hoặc từ khi một nội dung ghi nhận chuyển sang PagingData mới. (Ib682e)
Phiên bản 3.1.0-beta01
Ngày 13 tháng 10 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-beta01. Phiên bản 3.1.0-beta01 bao gồm các thay đổi sau.
Sửa lỗi
- Sửa lỗi có quá nhiều lượt truy cập nhanh vào mục khiến chúng bị bỏ qua để xem xét trong prefetchDistance, khiến việc tải trang bị treo. Điều này đặc biệt quan trọng khi nhiều mục được bố trí cùng một lúc theo thứ tự ưu tiên việc tải theo hướng cuộn của người dùng. Các lượt truy cập vào mục này hiện đã được lưu vào bộ đệm và được ưu tiên đồng bộ để ngăn không cho chúng bị bỏ qua. (aosp/1833273)
Phiên bản 3.1.0-alpha04
Ngày 29 tháng 9 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-alpha04. Phiên bản 3.1.0-alpha04 bao gồm các thay đổi sau.
Thay đổi về API
- Các API
Flow<PagingData>.observablevàFlow<PagingData>.flowablekhông còn mang tính thử nghiệm nữa. (Ie0bdd)
Sửa lỗi
- Đối với loadStates,
endOfPaginationReachedhiện luôn làfalsechoLoadType.REFRESH. Trước đây, endOfPaginationReached có thể làtruecho RemoteMediatorREFRESHchứ không phải là PagingSource. Hành vi này hiện được hợp nhất để luôn trả vềfalsevì sẽ không có ý nghĩa khi REFRESH là thiết bị đầu cuối và hiện được đưa vào tài liệu như một phần của sự co rút ngắn API trong LoadStates. Khi quyết định xem việc phân trang có bị chấm dứt hay không, bạn phải luôn thực hiện điều này theo hướng dẫn về APPEND hoặc PREPEND. (I047b6) Hiện giờ, LoadStates từ Paging đang chờ các giá trị hợp lệ từ cả PagingSource và RemoteMediator trước khi phát xuống dưới giữa các thế hệ. Việc này ngăn các thế hệ mới của PagingData gửi đi NotLoading trong CombinedLoadStates.source.refresh nếu nó đã là Loading; các thế hệ mới của PagingData hiện sẽ luôn bắt đầu đúng cách với Loading cho trạng thái làm mới thay vì đặt lại về trạng thái NotLoading một cách không chính xác ngay từ đầu trong một số trường hợp.
Giờ đây, việc huỷ các thế hệ trước sẽ xảy ra trong trường hợp không hợp lệ / thế hệ mới. Bạn không cần phải sử dụng .collectLatest trên
Flow<PagingData>nữa, mặc dù chúng tôi vẫn khuyên bạn nên làm như vậy. (I0b2b5, b/177351336, b/195028524).loadStateFlowvà.addLoadStateListenertrên API trình bày không còn gửi thừaCombinedLoadStatesban đầu khiến các trạng thái dàn xếp luôn được đặt thànhnullvà trạng thái nguồn được đặt thànhNotLoading(endOfPaginationReached = false). Điều này có nghĩa là:- các trạng thái dàn xếp sẽ luôn được điền sẵn nếu bạn sử dụng RemoteMediator.
- Việc đăng ký một trình nghe loadState mới hoặc một trình thu thập mới trên
.loadStateFlowsẽ không còn phát ra ngay giá trị hiện tại nữa nếu chưa nhận đượcCombinedLoadStatesthực sự từPagingData. Điều này có thể xảy ra nếu một trình thu thập hoặc trình nghe bắt đầu trước khiPagingDatađược gửi. (I1a748)
Phiên bản 3.1.0-alpha03
Ngày 21 tháng 7 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-alpha03. Phiên bản 3.1.0-alpha03 bao gồm các thay đổi sau.
Thay đổi về API
Loại dữ liệu trả về LoadResult thứ ba trong LoadResult.Invalid được thêm vào PagingSource. Khi PagingSource.load trả về LoadResult.Invalid, Paging sẽ loại bỏ dữ liệu đã tải và vô hiệu hoá PagingSource. Loại dữ liệu trả về này được thiết kế để xử lý dữ liệu có khả năng không hợp lệ hoặc lỗi thời có thể bị trả về từ cơ sở dữ liệu hoặc mạng.
Ví dụ: nếu cơ sở dữ liệu ban đầu được viết vào nhưng PagingSource không vô hiệu hoá kịp thời, thì cơ sở dữ liệu đó có thể trả về các kết quả không nhất quán nếu việc triển khai phụ thuộc vào tính bất biến của tập dữ liệu sao lưu mà kết quả được tải từ đó (ví dụ: triển khai kiểu GIỚI HẠN CHÊNH LỆCH db). Trong trường hợp này, bạn nên kiểm tra trạng thái không hợp lệ sau khi tải và trả về LoadResult.Invalid, khiến Paging loại bỏ bất kỳ yêu cầu tải đang chờ xử lý hoặc trong tương lai nào đối với PagingSource này và vô hiệu hoá nó.
Loại dữ liệu trả về này cũng được hỗ trợ bởi API Paging2, trong đó sử dụng LivePagedList hoặc RxPagedList. Khi sử dụng một PagingSource với API PagedList của Paging2, PagedList được tách ra ngay lập tức, dừng các lần thử tải dữ liệu khác trên PagedList này và trình kích hoạt vô hiệu hoá trên PagingSource.
loadResult là một lớp kín, tức là đây là một thay đổi không tương thích với nguồn, chẳng hạn như các trường hợp sử dụng trực tiếp bằng kết quả PagingSource.load. Kết quả sẽ là để xử lý LoadResult.Invalid tại thời gian biên dịch. Ví dụ: người dùng Kotlin sử dụng biểu thức exhaustive-when để kiểm tra loại dữ liệu trả về sẽ phải đánh dấu vào loại Không hợp lệ. (Id6bd3, b/191806126, b/192013267)
Sửa lỗi
- Giờ đây, các lệnh gọi lại vô hiệu hoá được thêm qua PagingSource.registerInvalidatedCallback hoặc DataSource.addInvalidatedCallback sẽ tự động kích hoạt nếu các lệnh đó được đăng ký trên PagingSource / DataSource vốn đã không hợp lệ. Điều này giải quyết một điều kiện tranh đấu khiến Paging bỏ qua các tín hiệu không hợp lệ và bị mắc kẹt khi được cung cấp một Nguồn vốn đã không hợp lệ trong lần tải đầu tiên. Ngoài ra, các lệnh gọi lại vô hiệu hoá hiện sẽ bị xoá đúng cách sau khi được kích hoạt vì các lệnh gọi lại này được đảm bảo sẽ được gọi nhiều nhất một lần. (I27e69)
- Gửi giá trị ban đầu của phần giữ chỗ (InitialPagedList) từ luồng PagedList mới được tạo phiên bản, ví dụ: LivePagedListBuilder hoặc RxPagedListBuilder sẽ không xoá dữ liệu được tải trước đó nữa.
Phiên bản 3.1.0-alpha02
Ngày 1 tháng 7 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-alpha02. Phiên bản 3.1.0-alpha02 bao gồm các thay đổi sau.
Tính năng mới
Thêm vào trình nghe onPagesPresented và các API trình bày theo luồng kích hoạt ngay sau khi các trang trình bày được cập nhật trong giao diện người dùng.
Vì những bản cập nhật này đồng bộ với giao diện người dùng, nên bạn có thể gọi các phương thức trình chuyển đổi như .snapshot, .getItemCount, để kiểm tra trạng thái sau khi sử dụng bản cập nhật đó. Xin lưu ý rằng .snapshot() được để lại để gọi một cách rõ ràng vì có thể tốn kém khi thực hiện việc này trên tất cả các bản cập nhật.
Việc cập nhật trang có thể xảy ra trong các trường hợp sau:
- Hoàn tất lần tải thế hệ PagingData mới đầu tiên, bất kể thế hệ mới có bất kỳ thay đổi nào đối với các mục đã được trình bày hay không. tức là Khi thế hệ mới hoàn tất lần tải đầu tiên mà không có nội dung cập nhật nào vì danh sách vẫn giữ nguyên như vậy, thì lệnh gọi lại này vẫn được kích hoạt.
- Một trang sẽ được chèn, ngay cả khi trang được chèn không có mục mới nào
- Một trang sẽ bị bỏ qua, ngay cả khi trang bị bỏ qua không có mục nào (I272c9, b/189999634)
Sửa lỗi
- Việc truy cập PagedList.dataSource từ giá trị ban đầu do LivePagedList hoặc RxPagedList tạo ra sẽ không còn gửi nhầm IllegalStateException (I96707) nữa
Phiên bản 3.1.0-alpha01
Ngày 2 tháng 6 năm 2021
Phát hành androidx.paging:paging-*:3.1.0-alpha01. Phiên bản 3.1.0-alpha01 bao gồm các thay đổi sau.
Thay đổi về API
- Các lớp do
paging-rxjava3cung cấp hiện nằm trong góiandroidx.paging.rxjava3để không xung đột vớipaging-rxjava2(Ifa7f6)
Sửa lỗi
- Sửa lỗi khi Paging đôi khi gửi sự kiện khác không hoạt động đến RecyclerView, có thể khiến một số trình nghe kích hoạt sớm. (Ic507f, b/182510751)
Đóng góp bên ngoài
- Thêm các API có khả năng tương thích với PagedList không dùng nữa vào cấu phần phần mềm rxjava3 (Id1ce2, b/182497591)
Paging Compose Phiên bản 1.0.0
Phiên bản 1.0.0-alpha20
Ngày 24 tháng 5 năm 2023
Phát hành androidx.paging:paging-compose:1.0.0-alpha20. Phiên bản 1.0.0-alpha20 bao gồm các thay đổi sau.
Tính năng mới
- Paging Compose hiện hỗ trợ xem trước danh sách dữ liệu giả bằng cách tạo một
PagingData.from(fakeData)và bao bọcPagingDatađó trong mộtMutableStateFlow(ví dụ:MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Bằng cách sử dụng dữ liệu đó làm dữ liệu đầu vào cho@Preview, các lệnh gọi đếncollectAsLazyPagingItems()sẽ cung cấpLazyPagingItemscó thể xem trước. (I8a78d, b/194544557)
Sửa lỗi
- Dữ liệu được lưu vào bộ nhớ đệm từ
pager.flow.cachedInđã được thu thập trongLazyPagingItemshiện sẽ có sẵn ngay sau khi khôi phục trạng thái mà không cần thu thập không đồng bộ. Điều này có nghĩa là dữ liệu trong bộ nhớ đệm sẽ sẵn sàng để trình bày ngay khi thành phần ban đầu được tạo sau khi trạng thái được khôi phục. (I97a60, b/177245496)
Phiên bản 1.0.0-alpha19
Ngày 3 tháng 5 năm 2023
Phát hành androidx.paging:paging-compose:1.0.0-alpha19. Phiên bản 1.0.0-alpha19 bao gồm các thay đổi sau.
Hỗ trợ tất cả bố cục trì hoãn
Trước đây, Paging Compose cung cấp các tiện ích items và itemsIndexed tuỳ chỉnh trên LazyListScope, tức là bạn không thể dùng Paging Compose với các bố cục tải từng phần khác như LazyVerticalGrid, HorizontalPager hoặc các thành phần tải từng phần tuỳ chỉnh khác do thư viện Wear và TV cung cấp. Bản cập nhật chính của bản phát hành này là giải quyết vấn đề thiếu linh hoạt này.
Để hỗ trợ nhiều bố cục trì hoãn hơn, chúng tôi cần tạo các API ở một lớp khác – thay vì cung cấp một API items tuỳ chỉnh cho từng bố cục trì hoãn, Paging Compose hiện cung cấp các phương thức mở rộng ở cấp độ thấp hơn một chút trên LazyPagingItems trong itemKey và itemContentType. Các API này tập trung vào việc giúp bạn triển khai các tham số key và contentType cho các API items tiêu chuẩn đã có cho LazyColumn, LazyVerticalGrid cũng như các tham số tương đương trong các API như HorizontalPager. (Ifa13b, Ib04f0, b/259385813)
Điều này có nghĩa là việc hỗ trợ LazyVerticalGrid sẽ có dạng như sau:
// This part is unchanged
val lazyPagingItems = pager.collectAsLazyPagingItems()
LazyVerticalGrid(columns = GridCells.Fixed(2)) {
// Here we use the standard items API
items(
count = lazyPagingItems.itemCount,
// Here we use the new itemKey extension on LazyPagingItems to
// handle placeholders automatically, ensuring you only need to provide
// keys for real items
key = lazyPagingItems.itemKey { it.uniqueId },
// Similarly, itemContentType lets you set a custom content type for each item
contentType = lazyPagingItems.itemContentType { "contentType" }
) { index ->
// As the standard items call provides only the index, we get the item
// directly from our lazyPagingItems
val item = lazyPagingItems[index]
PagingItem(item = item)
}
}
Để xem thêm ví dụ về cách sử dụng các API mới này, vui lòng xem các mẫu của chúng tôi.
Mặc dù những thay đổi này khiến các ví dụ LazyColumn và LazyRow dài thêm vài dòng, nhưng chúng tôi cho rằng tính nhất quán trên tất cả các bố cục tải từng phần là một yếu tố quan trọng đối với những người dùng Paging Compose trong tương lai. Vì lý do đó, các tiện ích hiện có cho LazyListScope hiện đã bị ngừng sử dụng. (I0c459, I92c8f, b/276989796)
Thay đổi về API
- Để đơn giản hoá việc di chuyển sang các API mới, các hàm mở rộng
itemsvàitemsIndexedtrênLazyListScopehiện hỗ trợ tham sốcontentType, phản ánh khả năng hỗ trợ trong các API mới. (Ib1918, b/255283378)
Thông tin cập nhật về phần phụ thuộc
- Paging Compose đã cập nhật phần phụ thuộc từ Compose 1.0.5 lên Compose 1.2.1. (Ib1918, b/255283378)
Phiên bản 1.0.0-alpha18
Ngày 8 tháng 2 năm 2023
Phát hành androidx.paging:paging-compose:1.0.0-alpha18 mà không có thay đổi nào. Phiên bản 1.0.0-alpha18 bao gồm các thay đổi sau.
Phiên bản 1.0.0-alpha17
Ngày 24 tháng 10 năm 2022
Phát hành androidx.paging:paging-compose:1.0.0-alpha17. Phiên bản 1.0.0-alpha17 bao gồm các thay đổi sau.
Tính năng mới
- Thêm tính năng hỗ trợ cho một
CoroutineContexttuỳ chỉnh khi gọicollectLazyPagingItems. (I7a574, b/243182795, b/233783862)
Phiên bản 1.0.0-alpha16
Ngày 10 tháng 8 năm 2022
Phát hành androidx.paging:paging-compose:1.0.0-alpha16. Phiên bản 1.0.0-alpha16 bao gồm các thay đổi sau.
Tính năng mới
- Paging hiện cung cấp nhật ký thông qua lớp
LazyPagingItemsđể hiển thị thông tin gỡ lỗi được thu thập từ PagingData. - Bạn có thể bật tính năng nhật ký thông qua lệnh
adb shelladb shell setprop log.tag.Paging [DEBUG|VERBOSE]. ([b/235527159}(https://issuetracker.google.com/issues/235527159))
Sửa lỗi
- Khắc phục lỗi thiếu hàm khởi tạo
PagingDataDifferkhi sử dụngpaging-compose:1.0.0-alpha15vớipaging-common:3.1.1trở về trước. (b/235256201, b/239868768)
Phiên bản 1.0.0-alpha15
Ngày 1 tháng 6 năm 2022
Phát hành androidx.paging:paging-compose:1.0.0-alpha15. Phiên bản 1.0.0-alpha15 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm các hàm dựng cho
PagingDataAdaptervàAsyncPagingDataDifferchấp nhậnCoroutineContextthay vìCoroutineDispatcher. (Idc878)
Sửa lỗi
- Giờ đây,
LazyPagingItemssẽ đặtloadStateban đầu để làm mớiLoadState.Loading. (I55043, b/224855902)
Phiên bản 1.0.0-alpha14
Ngày 13 tháng 10 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha14. Phiên bản 1.0.0-alpha14 bao gồm các thay đổi sau.
Phiên bản 1.0.0-alpha13
Ngày 29 tháng 9 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha13. Phiên bản 1.0.0-alpha13 bao gồm các thay đổi sau.
Thay đổi về API
- Hàm
LazyPagingItems.snapshot()đã được thay thế bằng thuộc tínhLazyPagingItems.itemSnapshotList(Ie2da8) - Đã xoá
LazyPagingItems.getAsState()không dùng nữa (Ie65e4)
Phiên bản 1.0.0-alpha12
Ngày 21 tháng 7 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha12. Phiên bản 1.0.0-alpha12 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây,
items(lazyPagingItems)vàitemsIndexed(lazyPagingItems)dùng để kết nối Paging vớiLazyColumn/Rowchấp nhận thông số khoá tuỳ chọn, cho phép bạn chỉ định một khoá ổn định đại diện cho mục. Bạn có thể đọc thêm về các khoá tại đây. (I7986d) - Giờ đây, hàm
lazyPagingItems.getAsState(index)không còn dùng nữa. Thay vào đó, hãy sử dụnglazyPagingItems[index]. (I086cb, b/187339372)
Phiên bản 1.0.0-alpha11
Ngày 30 tháng 6 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha11. Phiên bản 1.0.0-alpha11 bao gồm các thay đổi sau.
Phiên bản 1.0.0-alpha10
Ngày 2 tháng 6 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha10. Phiên bản 1.0.0-alpha10 bao gồm các thay đổi sau.
Phiên bản 1.0.0-alpha09
Ngày 18 tháng 5 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha09. Phiên bản 1.0.0-alpha09 bao gồm các thay đổi sau.
Sửa lỗi
- Chúng tôi hiện có thể quan sát được itemCount và phương thức getter của mục thuộc LazyPagingItems, cho phép sử dụng nó với cả LazyVerticalGrid (Ie2446, b/171872064, b/168285687
Khả năng tương thích với ứng dụng Compose
androidx.paging:paging-compose:1.0.0-alpha09chỉ tương thích với ứng dụng Compose phiên bản1.0.0-beta07trở lên.
Phiên bản 1.0.0-alpha08
Ngày 24 tháng 2 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha08. Phiên bản 1.0.0-alpha08 bao gồm các thay đổi sau.
Cập nhật để tích hợp với Compose 1.0.0-beta01.
Phiên bản 1.0.0-alpha07
Ngày 10 tháng 2 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha07. Phiên bản 1.0.0-alpha07 bao gồm các thay đổi sau.
Cập nhật để tích hợp với Compose alpha12.
Phiên bản 1.0.0-alpha06
Ngày 28 tháng 1 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha06. Phiên bản 1.0.0-alpha06 bao gồm các thay đổi sau.
Sửa lỗi
Cập nhật để phụ thuộc vào Compose 1.0.0-alpha11.
Phiên bản 1.0.0-alpha05
Ngày 13 tháng 1 năm 2021
Phát hành androidx.paging:paging-compose:1.0.0-alpha05. Phiên bản 1.0.0-alpha05 bao gồm các thay đổi sau.
Cập nhật để phụ thuộc vào Compose 1.0.0-alpha10.
Phiên bản 1.0.0-alpha04
Ngày 16 tháng 12 năm 2020
Phát hành androidx.paging:paging-compose:1.0.0-alpha04. Phiên bản 1.0.0-alpha04 bao gồm các thay đổi sau.
Sửa lỗi
- Cập nhật các thuộc tính tiện lợi,
CombinedLoadStates.refresh,CombinedLoadStates.prepend,CombinedLoadStates.appendđể chỉ chuyển đổi từLoadingsangNotLoadingsau khi cả trạng thái dàn xếp và trạng thái tải nguồn đều làNotLoadingđể đảm bảo đã áp dụng bản cập nhật từ xa. (I65619)
Phiên bản 1.0.0-alpha03
Ngày 2 tháng 12 năm 2020
Phát hành androidx.paging:paging-compose:1.0.0-alpha03. Phiên bản 1.0.0-alpha03 bao gồm các thay đổi sau.
- Cập nhật để khớp với Compose 1.0.0-alpha08.
Phiên bản 1.0.0-alpha02
Ngày 11 tháng 11 năm 2020
Phát hành androidx.paging:paging-compose:1.0.0-alpha02. Phiên bản 1.0.0-alpha02 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm các phương thức
.peek(),.snapshot(),.retry()và.refresh()vàoLazyPagingItem. Việc này hiển thị chức năng tương tự có trongAsyncPagingDataDiffer/PagingDataAdapter(Iddfe8, b/172041660)
Phiên bản 1.0.0-alpha01
Ngày 28 tháng 10 năm 2020
Phát hành androidx.paging:paging-compose:1.0.0-alpha01. Phiên bản 1.0.0-alpha01 bao gồm các thay đổi sau.
Tính năng mới
Cấu phần phần mềm paging-compose cung cấp tuỳ chọn tích hợp giữa thư viện Paging và Jetpack Compose. Ví dụ về cách sử dụng đơn giản:
@Composable
@OptIn(ExperimentalLazyDsl::class)
fun ItemsDemo(flow: Flow<PagingData<String>>) {
val lazyPagingItems = flow.collectAsLazyPagingItems()
LazyColumn {
items(lazyPagingItems) {
Text("Item is $it")
}
}
}
Phiên bản 3.0.1
Phiên bản 3.0.1
Ngày 21 tháng 7 năm 2021
Phát hành androidx.paging:paging-*:3.0.1. Phiên bản 3.0.1 bao gồm các thay đổi sau.
Sửa lỗi
- Việc truy cập vào
PagedList.dataSourcetừ giá trị ban đầu doLivePagedListhoặcRxPagedListtạo ra sẽ không còn gửi nhầm IllegalStateException (I96707) nữa
Phiên bản 3.0.0
Phiên bản 3.0.0
Ngày 5 tháng 5 năm 2021
Phát hành androidx.paging:paging-*:3.0.0. Phiên bản 3.0.0 bao gồm các thay đổi sau.
Các tính năng chính của Phiên bản 3.0.0
Ngừng sử dụng phần lớn API hiện tại từ Paging 2.x.x và thay bằng API Paging 3 mới để mang đến các cải thiện sau:
- Hỗ trợ hạng nhất cho coroutine và Flow trong Kotlin
- Hỗ trợ huỷ
- Tích hợp trạng thái tải và các tín hiệu lỗi
- Chức năng thử lại + làm mới
- Tất cả ba lớp con của DataSource đã được kết hợp thành một lớp PagingSource thống nhất
- Các lượt chuyển đổi trang tuỳ chỉnh, bao gồm cả lượt tích hợp sẵn để thêm dòng phân cách
- Đầu trang và chân trang trạng thái đang tải
Phiên bản 3.0.0-rc01
Ngày 21 tháng 4 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-rc01. Phiên bản 3.0.0-rc01 bao gồm các thay đổi sau.
Sửa lỗi
- Sửa lỗi khi Paging đôi khi gửi sự kiện khác không hoạt động đến RecyclerView, có thể khiến một số trình nghe kích hoạt sớm. (Ic507f, b/182510751)
Phiên bản 3.0.0-beta03
Ngày 24 tháng 3 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-beta03. Phiên bản 3.0.0-beta03 bao gồm các thay đổi sau.
Sửa lỗi
- Chúng tôi đã cải tiến cách xử lý phần giữ chỗ khi bạn tải lại danh sách để ngăn chặn việc chuyển chỗ bất ngờ trong RecyclerView. Hãy xem NullPaddedDiffing.md để biết thông tin chi tiết. (If1490, b/170027529, b/177338149)
- Các trình tạo PagedList khác nhau (đường dẫn tương thích cũ) không còn gọi đồng bộ nhầm
DataSource.Factory.create()trên luồng Chính khi.build()được gọi nữa. (b/182798948)
Phiên bản 3.0.0-beta02
Ngày 10 tháng 3 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-beta02. Phiên bản 3.0.0-beta02 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây, các phần mở rộng Rx3 sẽ truyền chính xác
@ExperimentalCoroutinesApiyêu cầu chọn tham gia. Trước đây, chúng được đánh dấu trên phương thức@get, bị trình biên dịch Kotlin bỏ qua do: https://youtrack.jetbrains.com/issue/KT-45227 (I5733c)
Sửa lỗi
- Thực thi các hạn chế sử dụng công khai API thử nghiệm (I6aa29, b/174531520)
- Sửa lỗi khiến
PagingStateluôn lànullkhi tính năng làm mới từ xa được gọi. - Sửa lỗi các trang trống bị PagingSource trả về có thể khiến Paging không tìm nạp lại được để thực hiện
prefetchDistancekhiến cho Paging bị "nghẽn".
Phiên bản 3.0.0-beta01
Ngày 10 tháng 2 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-beta01. Phiên bản 3.0.0-beta01 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây, trình bao bọc Rx2 và Rx3 sẽ hiển thị chú thích mang tính thử nghiệm mà nó
phụ thuộc. Nếu bạn đang dùng trình bao bọc khả năng tương thích Rx trong paging-rxjava2 or
paging-rxjava3, thì giờ đây, bạn cần chú thích các cách sử dụng bằng
@OptIn(ExperimentalCoroutinesApi::class)(Ib1f9d)
Sửa lỗi
- Đôi khi,
IndexOutOfBoundsException: Inconsistency detectedcố định được gửi khi sử dụng API v2DataSourcethông qua đường dẫn tương thích - Lệnh gọi
isInvalidtrong quá trình khởi độngDataSourcekhi dùng qua các đường dẫn tương thích hiện đã khởi chạy chính xác trên fetchDispatcher thay vì trên luồng chính. Thao tác này sẽ sửaIllegalStateExceptiondo quyền truy cập Db vào luồng chính khi dùng cách triển khaiPagingSourcecủa Room.
Phiên bản 3.0.0-alpha13
Ngày 27 tháng 1 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-alpha13. Phiên bản 3.0.0-alpha13 bao gồm các thay đổi sau.
Thay đổi về API
PagingSource.getRefreshKeykhông còn là tuỳ chọn để triển khai nữa, mà đã trở thành một hàm trừu tượng không cần triển khai mặc định. Người dùng đã di chuyển có thể tiếp tục quay lại phương thức triển khai mặc định, đơn giản là quay lạinull, nhưnggetRefreshKey()sẽ có phương thức triển khai thực tế để trả về khoá dựa trên vị trí cuộn hiện tại của người dùng cho phép Paging tiếp tục tải vào giữa khung nhìn quaPagingState.anchorPositionnếu có thể. (I4339a)- Giờ đây,
InvalidatingPagingSourceFactorylà lớp cuối cùng (Ia3b0a) - Cho phép định cấu hình hành vi của dòng phân cách đầu cuối (đầu trang / chân trang)
với thông số SeparatorType tuỳ chọn bổ sung. Hai
tuỳ chọn bao gồm:
FULLY_COMPLETE– hành vi hiện tại; đợi cả PagingSource và RemoteMediator để đánh dấu endOfPaginationReached trước khi thêm các dòng phân cách của dòng lệnh. Nếu bạn không sử dụng RemoteMediator, thì loadState từ xa sẽ được bỏ qua. Cách này chủ yếu hữu ích nếu bạn chỉ muốn hiển thị các dòng phân cách mục khi mục đã được tải đầy đủ, bao gồm cả việc tìm nạp nguồn từ xa, chẳng hạn như mạng.SOURCE_COMPLETE– chỉ đợi PagingSource để đánh dấu endOfPaginationReached ngay cả khi sử dụng RemoteMediator. Điều này cho phép đầu trang và chân trang được trình bày đồng bộ với lượt tải đầu tiên, giúp người dùng không cần phải cuộn để xem các dòng phân cách dòng lệnh. (Ibe993, b/174700218)
Sửa lỗi
- Khắc phục một sự cố rò rỉ bộ nhớ hiếm gặp xảy ra khi PagingSource không còn hợp lệ trước khi PageFetcher thậm chí có thể bắt đầu tải từ đó. (I9606b, b/174625633)
Phiên bản 3.0.0-alpha12
Ngày 13 tháng 1 năm 2021
Phát hành androidx.paging:paging-*:3.0.0-alpha12. Phiên bản 3.0.0-alpha12 bao gồm các thay đổi sau.
Thay đổi về API
- InvalidatingPagingSourceFactory không còn là lớp trừu tượng nữa vì chưa từng có bất kỳ phương thức trừu tượng nào. (I4a8c4)
- Thêm phương thức nạp chồng (overload) của .cachedIn() chấp nhận ViewModel thay vì Lifecycle hoặc CoroutineScope cho người dùng Java. (I97d81, b/175332619)
- Cho phép phương thức gọi Java sử dụng toán tử biến đổi PagingData
theo cách không đồng bộ, bằng cách chấp nhận một Executor thành các đối số của toán tử biến đổi. Giờ đây, tất cả các toán tử biến đổi -Sync đều đã bị xoá hậu tố -Sync
và người dùng Coroutine của Kotlin sẽ cần phân biệt bằng cách
gọi hàm mở rộng chấp nhận một khối tạm ngưng.
Tất cả các toán tử biến đổi PagingData đã được chuyển sang phần mở rộng
trong lớp PagingDataTransforms tĩnh. Người dùng Java sẽ cần
gọi chúng thông qua trình trợ giúp tĩnh, ví dụ:
PagingDataTransforms.map(pagingData, transform)Đối với người dùng Kotlin, cú pháp giống nhau nhưng bạn cần nhập hàm. (If6885, b/172895919)
Sửa lỗi
- Sửa lỗi khi
RemoteMediator.load()không được gọi trongadapter.refresh()nếu đã đạt đến quá trình phân trang.
Phiên bản 3.0.0-alpha11
Ngày 16 tháng 12 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha11. Phiên bản 3.0.0-alpha11 bao gồm các thay đổi sau.
Tính năng mới
- Hỗ trợ trạng thái đã lưu được thêm cho các trường hợp sử dụng cơ bản sau (hỗ trợ đầy đủ, đặc biệt là trong trường hợp nguồn theo lớp vẫn đang trong quá trình xử lý):
- luồng được lưu vào bộ nhớ đệm và ứng dụng không bị chấm dứt (ví dụ: luồng được lưu vào bộ nhớ đệm trong mô hình chế độ xem và hoạt động được tạo lại trong quá trình này)
- paging source được tính, phần giữ chỗ được cho phép và bố cục không hiển thị xen kẽ.
Thay đổi về API
PagingSource.getRefreshKey()hiện là API ổn định (I22f6f, b/173530980)PagingSource.invalidatekhông còn là một hàm mở. Nếu bạn cần nhận thông báo khi xảy ra trường hợp không hợp lệ, hãy cân nhắc gọi phương thức registerInvalidatedCallback thay vì ghi đè phương thức không hợp lệ. (I628d9, b/173029013, b/137971356)- Giờ đây, Pager có một hàm khởi tạo mang tính thử nghiệm duy nhất cùng với các hàm khởi tạo thông thường, thay vì làm rò rỉ API thử nghiệm vào API công khai không mang tính thử nghiệm thông qua chú thích chọn tham gia. (I9dc61, b/174531520)
- Cập nhật các thuộc tính tiện lợi,
CombinedLoadStates.refresh,CombinedLoadStates.prepend,CombinedLoadStates.appendđể chỉ chuyển đổi từLoadingsangNotLoadingsau khi cả trạng thái dàn xếp và trạng thái tải nguồn đều làNotLoadingđể đảm bảo đã áp dụng bản cập nhật từ xa. (I65619) LoadParams.pageSize đã bị xoá (không còn được dùng nữa). Bạn nên sử dụng
LoadParams.loadSizetrong PagingSource.LoadParams.loadSizeluôn bằngPagingConfig.pageSizengoại trừ lệnh gọi lần tải đầu tiên với mã đó bằngPagingConfig.initialLoadSize.Nếu bạn đang thử nghiệm Paging2 DataSource mà không sử dụng Pager hoặc PagedList, thì
pageSizecó thể không khớp vớiPagingConfig.pageSizenếu bạn cũng đang cài đặtinitialLoadSize. Nếu điều này quan trọng đối với thử nghiệm của bạn, hãy thử sử dụng Pager/PagedList để đặt PageSize chính xác nội bộ cho phương thức tải DataSource của bạn. (I98ac7, b/149157296)
Sửa lỗi
- Khắc phục sự cố do IllegalStateException khi sử dụng dòng phân cách với tập hợp PagingConfig.maxSize. (I0ed33, b/174787528)
- Sửa lỗi khi trạng thái tải cho PREPEND / APPEND không
cập nhật thành
NotLoading(endOfPaginationReached = true)ngay lập tức sau lần tải đầu tiên nếu đã cài đặt RemoteMediator (I8cf5a) - Sửa lỗi khi API presenter-side như .snapshot(), .peek(), v.v. trả về danh sách trước đó (đã lỗi thời) trong bản cập nhật ListUpdateCallback.
- Sửa lỗi khi toán tử dòng phân cách không thêm đầu trang hoặc chân trang khi sử dụng với RemoteMediator
- Sửa lỗi khi các bản cập nhật LoadState thành NotLoading cho RemoteMediator bị kẹt ở trạng thái Loading
- Sửa lỗi khi API tương thích Paging2.0,
.asPagingSourceFactory(), có thể khiếnDataSourcesao lưu khởi động trên CoroutineDispatcher một cách không chính xác. Điều này giải quyết sự cố và các trường hợp ANR có thể xảy ra, đặc biệt khi sử dụng cách triển khai PagingSource hiện tại của Room, vốn sử dụng đường dẫn tương thích này.
Phiên bản 3.0.0-alpha10
Ngày 2 tháng 12 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha10. Phiên bản 3.0.0-alpha10 bao gồm các thay đổi sau.
Thay đổi về API
Các API
dataRefreshFlowvàdataRefreshListenerkhông dùng nữa đã bị xoá vì không còn cần thiết cho các bản cập nhật loadStateFlow / Listener nữa. Đối với những di chuyển đó, loadStateFlow tương đương là:loadStateFlow.distinctUntilChangedBy { it.refresh } .filter { it.refresh is NotLoading }
Sửa lỗi
- Giờ đây, endOfPaginationReached for RemoteMediator
REFRESHtruyền chính xác đến các bản cập nhật LoadState và ngănAPPENDvàPREPENDtừ xa kích hoạt. (I94a3f, b/155290248) - Việc hiển thị một danh sách trống do trang ban đầu trống hoặc
quá nhiều hoạt động lọc sẽ không còn ngăn Paging bắt đầu tải
PREPENDhoặcAPPEND. (I3e702, b/168169730) - Khắc phục vấn đề không gọi được
getRefreshKeytrên các thế hệ tiếp theo của PagingSource khi các trường hợp không hợp lệ diễn ra nhanh chóng. (I45460, b/170027530)
Đóng góp bên ngoài
- InvalidatingPagingSourceFactory thuộc lớp trừu tượng mới đã được thêm vào
bằng một API
.invalidate()dùng để chuyển tiếp vô hiệu hoá tất cả PagingSources phát ra. Nhờ có @claraf3! (Ie71fc, b/160716447)
Các lỗi đã biết
- Đầu trang và chân trang từ biến đổi .insertSeparators() có thể không xuất hiện ngay lập tức khi sử dụng RemoteMediator b/172254056
- Việc sử dụng RemoteMediator có thể làm cho
LoadStatetừ xa bị gián đoạn nếu điều này không hợp lệ vàPagingSource.load(LoadParams.Refresh(...))hoàn tất trước khiRemoteMediator.load()trả về b/173717820
Phiên bản 3.0.0-alpha09
Ngày 11 tháng 11 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha09. Phiên bản 3.0.0-alpha09 bao gồm các thay đổi sau.
Thay đổi về API
- Hoàn toàn không dùng các phương thức datarefreshFlow / Listener có mệnh đề replaceWith nữa. (I6e2dd)
Sửa lỗi
- Khắc phục lỗi
IllegalArgumentExceptionbị gửi đi khi sử dụng dòng phân cách với RemoteMediator và chế độ không hợp lệ được kích hoạt trong khi chế độ tải từ xa trả về endOfPagration vẫn đang chạy (I3a260)
Phiên bản 3.0.0-alpha08
Ngày 28 tháng 10 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha08. Phiên bản 3.0.0-alpha08 bao gồm các thay đổi sau.
Thay đổi về API
- Các biến thể Kotlin / Java của
DataSource.InvalidatedCallbackđã được kết hợp bằng cách bật các lượt chuyển đổi SAM trong Kotlin thông qua giao diện chức năng (có trong Kotlin 1.4). Việc này cũng sửa lỗi biến thể kotlin của các lệnh gọi lại vô hiệu hoá không được gọi sau khi được.maphoặc.mapByPagechuyển đổi. (I1f244, b/165313046)
Sửa lỗi
- Hoạt động tương tác của Paging với ViewPager đã được cải thiện đáng kể. Cụ thể là Paging không còn huỷ cuộc gọi
RemoteMediator#loaddo việc vô hiệu hoá trang nữa. Bạn cũng sẽ không còn thực hiện yêu cầu tải append/prepend nếu cần phải LÀM MỚI cho đến khi hoàn thành xong yêu cầu LÀM MỚI. (I6390b, b/162252536) - API kiểm tra lỗi mã nguồn dành cho MissingGetterMatchingBuilder được bật đối với androidx (I4bbea, b/138602561)
- Khắc phục lỗi khi trình trợ giúp
.withLoadState*ConcatAdaptergặp sự cố do thông báo cho RecyclerView từ luồng trong nền (I18bb5, b/170988309) - Khắc phục lỗi khi quá trình tải một trang không trống, rất nhỏ, đôi khi ngăn việc tìm nạp trước kích hoạt tải đúng cách.Iffda3 b/169259468
Phiên bản 3.0.0-alpha07
Ngày 1 tháng 10 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha07. Phiên bản 3.0.0-alpha07 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây, các toán tử dựa trên Guava của PagingData không đồng bộ sẽ chấp nhận Executor làm Param, để kiểm soát ngữ cảnh thực thi. (Id4372)
Sửa lỗi
- Khắc phục trường hợp ngoại lệ IndexOutOfBounds được gửi trong RemoteMediator do một điều kiện thực hiện. (I00b7f, b/165821814)
- Khắc phục một điều kiện thực hiện trong thao tác chuyển đổi DataSource -> PagingSource có thể khiến PagingSource xuất hiện để bỏ qua các tín hiệu không hợp lệ từ DataSource.
- Khắc phục vấn đề về logic tìm nạp trong trang đôi khi khiến logic này không thể nhận các thế hệ PagingSource mới cho đến khi hệ thống gọi PagingDataAdapter.refresh()
- Khắc phục vấn đề khiến vị trí cuộn đôi khi biến mất khi sử dụng DataSource chuyển đổi thành PagingSource (chẳng hạn như dữ liệu do Room tạo ra), kết hợp với RemoteMediator
Đóng góp bên ngoài
- Nhờ có @simonschiller đã thêm các toán tử biến đổi không đồng bộ dựa trên RxJava2, RxJava3 và Guava cho PagingData!
Phiên bản 3.0.0-alpha06
Ngày 2 tháng 9 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha06. Phiên bản 3.0.0-alpha06 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây,
UnsupportedOperationExceptionvới thông điệp rõ ràng hơn về việc không hỗ trợ cho mã ổn định sẽ được gửi bất cứ khi nàoPagingDataAdapter.setHasStableIdsđược gọi. (Ib3890, b/158801427)
Sửa lỗi
- insertSeparators không còn lọc ra các trang trống cho phép công cụ trình bày chấp nhận khoảng cách tìm nạp trước ngay cả trong trường hợp có nhiều trang trống được chèn vào. (I9cff6, b/162538908)
Phiên bản 3.0.0-alpha05
Ngày 19 tháng 8 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha05. Phiên bản 3.0.0-alpha05 bao gồm các thay đổi sau.
Sửa lỗi
- Giờ đây, Page sẽ tìm nạp trước chính xác các trang ngay cả khi dữ liệu đã trình bày bị lọc quá nhiều
- Hoạt động trả về
LoadResult.Errorvào một thử nghiệm tải lại không còn làm cho các lượt truy cập vào mục kích hoạt lại sự kiện một cách không chính xác
Đóng góp bên ngoài
- Nhờ có Clara F đã giúp xoá bớt một số thử nghiệm! (549612)
Phiên bản 3.0.0-alpha04
Ngày 5 tháng 8 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha04. Phiên bản 3.0.0-alpha04 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm API
peek()vàoAsyncPagingDataDiffervàPagingDataAdapterđể cho phép truy cập vào dữ liệu được trình bày mà không cần kích hoạt tải trang. (I38898, b/159104197) - Thêm API
snapshot()vàoPagingDataAdaptervàAsyncPagingDataDifferđể cho phép truy xuất các mục được trình bày mà không cần kích hoạt tìm nạp trang. (I566b6, b/159104197) - Thêm một hàm khởi tạo
PagingData.from(List<T>)để cho phép hiển thị các danh sách tĩnh (có thể kết hợp với quy trình PagingData tổng thể) để hiển thị các danh sách tĩnh ở một số trạng thái nhất định, ví dụ: trước khi quy trình LÀM MỚI ban đầu kết thúc hoặc chỉ đơn giản là để thử nghiệm các biến đổi. (Id134d) - Không dùng các API dataRefresh Flow / Listener nữa vì các API này được thiết kế để hiển thị trạng thái các mục được trình bày trên REFRESH, nhưng với các cải tiến về thời gian gọi lại loadState Flow / Listener và thuộc tính itemCount, API này là một giao diện thừa (Ia19f3)
- Thêm trình bao bọc tương thích RxJava3 cho
PagingSourcevàRemoteMediator(I49ef3, b/161480176)
Sửa lỗi
PositionalDataSourceđược chuyển đổi thànhPagingSourcethông qua trình trợ giúptoPagingSourceFactory, bao gồm cảPagingSourcedo Room tạo ra hiện đã tự đánh dấu chính xác để hỗ trợ việc chuyển đổi. (I3e84c, b/162161201)- Khắc phục lỗi khi việc sử dụng biến thể đồng bộ của submitData
đôi khi sẽ dẫn đến việc thực hiện gây ra
ClosedSendChannelException(I4d702, b/160192222)
Đóng góp bên ngoài
- Cảm ơn Zac Sweers đã thay mặt cho Slack thêm trình bao bọc khả năng tương thích với RxJava3! (I49ef3, b/161480176)
Phiên bản 3.0.0-alpha03
Ngày 22 tháng 7 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha03. Phiên bản 3.0.0-alpha03 bao gồm các thay đổi sau.
Thay đổi về API
- Giờ đây, hàm khởi tạo cho PagingState ở chế độ công khai. Điều này sẽ giúp việc triển khai getRefreshKey() thử nghiệm trở nên dễ dàng hơn (I8bf15)
- Ẩn các biến thể hàm bản đồ kotlin của DataSource từ Java, để giải quyết sự không rõ ràng giữa các biến thể gốc và kotlin. (If7b23, b/161150011)
- Để tiện lợi cho người dùng Kotlin, chúng tôi đã đánh dấu các API thừa là @JvmSAggregate (I56ae5)
- Thêm các phương thức nạp chồng cho hàm khởi tạo của LoadResult.Page mặc định itemsBefore và itemsAfter là COUNT_UNDEFINED (I47849)
- Các toán tử PagingData hiện có sẽ chấp nhận các phương thức tạm ngưng và giới thiệu các toán tử mới mapSync, flatMapSync và filterSync không tạm ngưng cho người dùng Java. Các phương thức biến đổi hiện có đã được chuyển sang các hàm mở rộng, vì vậy, người dùng Kotlin sẽ cần nhập các phương thức đó. (I34239, b/159983232)
Sửa lỗi
- PagingSources của Room (và PositionalDataSource) hiện sẽ hiển thị một dòng phân cách ở đầu trang để người dùng không cần phải cuộn để hiển thị thông tin. (I6f747, b/160257628)
- Giờ đây, các lượt truy cập vào mục trên phần giữ chỗ sẽ kích hoạt tính năng PagingSource một cách chính xác cho đến khi một trang được trả về đáp ứng chỉ mục đã yêu cầu sau khi được biến đổi bằng PagingData.filter() (I95625, b/158763195)
- Sửa lỗi khi thao tác cuộn sau PagingSource trả về lỗi có thể ngăn PagingDataAdapter.retry() khỏi hoạt động thử lại. (I1084f, b/160194384)
- Sửa lỗi khi các lượt truy cập vào mục sau khi thả một trang có thể không tải trang mặc dù các lượt truy cập vào mục đó nằm trong prefetchDistance (Ie95ae, b/160038730)
- Thao tác đặt PagingConfig.maxSize không còn cho phép phần giữ chỗ sau một sự kiện thả xuống (I2be29, b/159667766)
Phiên bản 3.0.0-alpha02
Ngày 24 tháng 6 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha02. Phiên bản 3.0.0-alpha02 bao gồm các thay đổi sau.
Thay đổi về API
- Thêm các phương thức nạp chồng cho hàm khởi tạo của
PagingConfigvới các giá trị mặc định phổ biến (I39c50, b/158576040) - Thêm các phương thức nạp chồng cho hàm khởi tạo của
PagingDataAdaptervàAsyncPagingDataDiffervới các giá trị mặc định phổ biến (Ie91f5) - Giờ đây, API của trình chuyển đổi,
dataRefreshFlowvàdataRefreshListenerchuyển qua Boolean để báo hiệu liệuPagingDatacó trống hay không (I6e37e, b/159054196) - Thêm các API RxJava và Guava cho RemoteMediator - RxRemoteMediator và ListenableFutureRemoteMediator
- Thêm trình trợ giúp vào PagingState để truy cập các mục phổ biến như
isEmpty()vàfirstItemOrNull()(I3b5b6, b/158892717)
Sửa lỗi
- Giờ đây, Pager kiểm tra việc sử dụng lại PagingSource trong nhà máy, để ngăn việc vô tình sử dụng lại PagingSource không hợp lệ, dẫn đến lỗi không rõ ràng (I99809, b/158486430)
- Các lỗi từ RemoteMediator REFRESH không còn ngăn PagingSource tải nữa (I38b1b, b/158892717)
- Phiên bản không tạm ngưng của
submitDatakhông còn gây ra sự cố do thu thập đồng thời trên nhiềuPagingDatakhi được gọi sau phiên bản tạm ngưng củasubmitData. (I26358, b/158048877) - Đã khắc phục trường hợp ngoại lệ "không thể thu thập hai lần từ Pager" có thể xảy ra sau khi thay đổi cấu hình (I58lastModifiedDate, b/158784811)
Phiên bản 3.0.0-alpha01
Ngày 10 tháng 6 năm 2020
Phát hành androidx.paging:paging-*:3.0.0-alpha01. Phiên bản 3.0.0-alpha01 bao gồm các thay đổi sau.
Thư viện Paging đã cập nhật lên phiên bản 3.0 để hỗ trợ một số tính năng chính mới.
Các tính năng mới của phiên bản 3.0
- Hỗ trợ hạng nhất cho coroutine và Flow trong Kotlin.
- Hỗ trợ tải không đồng bộ bằng các chức năng tạm ngưng của coroutine, RxJava Single hoặc nguyên gốc Guava ListenableFutureids.
- Trạng thái tải tích hợp và các tín hiệu lỗi cho thiết kế giao diện người dùng thích ứng, bao gồm cả chức năng thử lại và làm mới.
- Cải tiến lớp của kho lưu trữ
- Đơn giản hoá giao diện nguồn dữ liệu
- Đơn giản hoá mạng + phân trang cơ sở dữ liệu
- Hỗ trợ huỷ
- Cải tiến lớp bản trình bày
Các lỗi đã biết
- Hiện chưa có Paging 3 javadocs. Tạm thời, hãy sử dụng các hướng dẫn nêu trên hoặc tài liệu về Kotlin. (b/158614050)
Phiên bản 2.1.2
Phiên bản 2.1.2
Ngày 18 tháng 3 năm 2020
Phát hành androidx.paging:paging:2.1.2. Phiên bản 2.1.2 bao gồm các thay đổi sau so với phiên bản 2.1.0.
Sửa lỗi
- Sửa lỗi cho
IndexOutOfBoundsExceptiontrong một số ít trường hợp khi chuyển đổi một vị trí trong thời gian vô hiệu hoá.
Vấn đề về bản phát hành
Paging phiên bản
2.1.1được phát hành không chính xác từ một nhánh bị định cấu hình sai, hiển thị chức năng và API được triển khai một phần trong bản phát hành sắp tới.Paging phiên bản
2.1.2chứa bản sửa lỗi căn giữa tải có trong phiên bản 2.1.1, nhưng lần này đã được chọn chính xác ngay trên bản phát hành 2.1.0. Nên nâng cấp lên bản phát hành này nếu đang dùng phiên bản 2.1.1.
Phiên bản 2.1.1
Phiên bản 2.1.1
Ngày 18 tháng 12 năm 2019
Phát hành androidx.paging:paging-*:2.1.1. Phiên bản 2.1.1 bao gồm các thay đổi sau.
Sửa lỗi
- Các lần tải đầu tiên liên tiếp từ PositionalDataSources hiện tập trung vào lần truy cập gần đây nhất khi đã tắt phần giữ chỗ
Phiên bản 2.1.0
Phiên bản 2.1.0
Ngày 25 tháng 1 năm 2019
Paging phiên bản 2.1.0 được phát hành mà không có thay đổi nào từ 2.1.0-rc01.
Phiên bản 2.1.0-rc01
Ngày 6 tháng 12 năm 2018
Paging phiên bản 2.1.0-rc01 được phát hành mà không có thay đổi nào từ 2.1.0-beta01.
Phiên bản 2.1.0-beta01
Ngày 1 tháng 11 năm 2018
Paging phiên bản 2.1.0-beta01 được phát hành mà không có thay đổi nào từ 2.1.0-alpha01.
Phiên bản 2.1.0-alpha01
Ngày 12 tháng 10 năm 2018
Paging phiên bản 2.1.0-alpha01 có hai nội dung bổ sung chính – đó là thả trang và thư viện tiện ích KTX của mỗi cấu phần phần mềm, cùng một số thay đổi về API và sửa lỗi khác.
Thay đổi về API
- Thêm
PagedList.Config.Builder.setMaxSize()để giới hạn số lượng mục được tải trong bộ nhớ. - Thêm
androidx.paging.Config()làm lựa chọn Kotlin thay thế choPagedList.Config.Builder - Thêm
androidx.paging.PagedList()làm lựa chọn Kotlin thay thế choPagedList.Builder - Thêm
DataSourceFactory.toLiveData()làm lựa chọn Kotlin thay thế choLivePagedListBuilder - Thêm
DataSourceFactory.toObservable()vàtoFlowable()làm lựa chọn Kotlin thay thế choRxPagedListBuilder - Thêm
AsyncPagedListDiffer.addPagedListListener()để nghe khi PagedList được hoán đổi. b/111698609 - Thêm biến thể
PagedListAdapter.onCurrentListChanged()chuyển danh sách cũ và mới, ngừng sử dụng biến thể trước đó. - Thêm biến thể
PagedListAdapter/AsyncPagedListDiffer.submitList()có chức năng gọi lại kích hoạt nếu/khi pagedlist hiển thị, sau khi so sánh. Điều này cho phép bạn đồng bộ hoá hoạt động hoán đổi PagedList với các bản cập nhật giao diện người dùng khác. b/73781068 - Thêm
PagedList.getLoadedCount()để cho bạn biết có bao nhiêu mục trong bộ nhớ. Lưu ý rằng giá trị trả về luôn bằng.size()nếu phần giữ chỗ bị tắt.
Sửa lỗi
- Khắc phục một ình huống tương tranh khi mở rộng nếu danh sách được sử dụng lại b/111591017
- Hiện tại,
PagedList.loadAround()sẽ cho raIndexOutOfBoundsExceptionkhi chỉ mục không hợp lệ. Trước đây, nó có thể gặp sự cố trừ trường hợp ngoại lệ không rõ ràng. - Khắc phục trường hợp kích thước tải ban đầu cực nhỏ cùng với dữ liệu không thay đổi sẽ không tải thêm nữa b/113122599
Phiên bản 2.0.0
Phiên bản 2.0.0
Ngày 1 tháng 10 năm 2018
Paging phiên bản 2.0.0 được phát hành với một bản sửa lỗi.
Sửa lỗi
- Khắc phục sự cố có thể xảy ra khi cuộn rất nhanh bằng
PositionalDataSourcevà phần giữ chỗ b/114635383.
Phiên bản 2.0.0-beta01
Ngày 2 tháng 7 năm 2018
Sửa lỗi
- Nội dung đã khắc phục sẽ biến mất trong một số trường hợp bổ sung (phần giữ chỗ bị tắt, PositionalDataSource) b/80149146
- (Đã phát hành trong
1.0.1) Khắc phục các sự cố xảy ra khiPagedListAdaptervàAsyncPagedListDifferkhông báo hiệu các sự kiện di chuyển. b/110711937
Các phần phụ thuộc trước AndroidX
Đối với các phiên bản trước AndroidX của Paging sau đó, hãy thêm vào các phần phụ thuộc sau:
dependencies {
def paging_version = "1.0.0"
implementation "android.arch.paging:runtime:$paging_version"
// alternatively - without Android dependencies for testing
testImplementation "android.arch.paging:common:$paging_version"
// optional - RxJava support
implementation "android.arch.paging:rxjava2:$paging_version"
}
Phiên bản 1.0.1
Phiên bản 1.0.1
Ngày 26 tháng 6 năm 2018
Paging phiên bản 1.0.1 được phát hành với một bản sửa lỗi trong runtime. Bạn nên sử dụng 1.0.1 để đảm bảo độ ổn định. Paging RxJava2 1.0.1 cũng được phát hành và giống với 1.0.0-rc1.
Sửa lỗi
- Khắc phục các sự cố xảy ra khi
PagedListAdaptervàAsyncPagedListDifferkhông báo hiệu các sự kiện di chuyển. b/110711937
RxJava2 Phiên bản 1.0.0
RxJava2 Phiên bản 1.0.0-rc1
Ngày 16 tháng 5 năm 2018
Paging RxJava2 1.0.0-rc1 đang chuyển sang phát hành đề xuất mà không có thay đổi nào trong phiên bản alpha
ban đầu.
Phiên bản 1.0.0
Phiên bản 1.0.0-rc1
Ngày 19 tháng 4 năm 2018 Bản phát hành dùng thử Paging
Chúng tôi không còn thêm bất kỳ vấn đề nào hay có các tính năng mới được lên lịch cho bản phát hành
Paging 1.0.0. Vui lòng nâng cấp các dự án của bạn để sử dụng 1.0.0-rc1, đồng thời giúp chúng tôi tiến hành thử nghiệm thành công để có thể mang lại trải nghiệm đáng tin cậy với phiên bản 1.0.0.
Không có thay đổi nào trong bản phát hành này, bản phát hành giống với 1.0.0-beta1.
Phiên bản 1.0.0-beta1
Ngày 5 tháng 4 năm 2018
Paging sẽ ở phiên bản thử nghiệm trong một thời gian ngắn trước khi phát hành bản dùng thử.
Chúng tôi hiện không có kế hoạch thay đổi API cho Paging 1.0 và thanh điều khiển cho các thay đổi API là rất cao.
Hỗ trợ Alpha RxJava2 để Paging được phát hành dưới dạng mô-đun tuỳ chọn riêng (android.arch.paging:rxjava2:1.0.0-alpha1) và sẽ tạm thời được tạo phiên bản riêng cho đến khi phiên bản này ổn định.
Thư viện mới này cung cấp phiên bản thay thế RxJava2 cho LivePagedListBuilder, có khả năng tạo
Observable và Flowable giây, mất Schedulers thay vì Executor:
Kotlin
val pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50) .setFetchScheduler(myNetworkScheduler) .buildObservable()
Java
Observable<PagedList<Item>> pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50) .setFetchScheduler(myNetworkScheduler) .buildObservable();
Tính năng mới
RxPagedListBuilderđược thêm thông qua cấu phần mềmandroid.arch.paging:rxjava2mới.
Thay đổi về API
Thay đổi về API để làm rõ vai trò của người thi hành trong trình tạo:
Đổi tên
setBackgroundThreadExecutor()thànhsetFetchExecutor()(trongPagedList.BuildervàLivePagedListBuilder)Đổi tên
setMainThreadExecutor()thànhsetNotifyExecutor()(trongPagedList.Builder).
Sửa thành viên
PagedList.mCallbacksthành chế độ riêng tư.
Sửa lỗi
LivePagedListBuilderkích hoạt lượt tảiPagedListban đầu trên trình thực thi đã chỉ định, thay vì nhóm chuỗi IO của thành phần Arch.Khắc phục hành vi không hợp lệ trong trình bao bọc
DataSourcenội bộ (dùng để triển khaiDataSource.map, cũng như tảiPositionalDataSourcetắt phần giữ chỗ) b/77237534
Phiên bản 1.0.0-alpha7
Ngày 21 tháng 3 năm 2018
Paging phiên bản 1.0.0-alpha7 được phát hành cùng với Lifecycles 1.1.1. Vì việc Paging alpha7 phụ thuộc vào việc di chuyển lớp Function đã đề cập ở trên, nên bạn cần phải cập nhật phần phụ thuộc lifecycle:runtime thành android.arch.lifecycle:runtime:1.1.1.
Theo kế hoạch, Paging alpha7 sẽ là bản phát hành cuối cùng trước khi Paging sang beta.
Thay đổi về API
- Các đối tượng
DataSource.LoadParamshiện có một hàm khởi tạo công khai và các đối tượngDataSource.LoadCallbackhiện đã mang tính trừu tượng. Thao tác này cho phép gói mộtDataSourcehoặc kiểm tra trực tiếp mộtDataSourcebằng một lệnh gọi lại mô phỏng. b/72600421 - Trình lập bản đồ cho DataSource và DataSource.Factory
map(Function<IN,OUT>)cho phép bạn biến đổi, gói hoặc trang trí các kết quả doDataSourcetải.mapByPage(<List<IN>,List<OUT>>)cho phép xử lý hàng loạt theo cách tương tự (ví dụ: khi các mục được tải từ SQL cần truy vấn thêm một cơ sở dữ liệu riêng biệt, có thể được thực hiện dưới dạng hàng loạt).
PagedList#getDataSource()được thêm dưới dạng một phương thức b/72611341- Tất cả lớp không dùng nữa đã bị xóa khỏi API, bao gồm cả phần còn lại của gói
recyclerview.extensionsvàLivePagedListProvider. DataSource.Factoryđược thay đổi từ giao diện thành một lớp trừu tượng để bật chức năng bản đồ.
Sửa lỗi
- Thay đổi Trình tạo thành phiên bản chính thức. b/70848565
- Việc triển khai Room
DataSourcehiện đã được khắc phục để xử lý các truy vấn có nhiều bảng. Bản sửa lỗi này có trong Room 1.1.0 beta, vui lòng xem ở trên. - Sửa lỗi
BoundaryCallback.onItemAtEndLoadedkhông được gọi choPositionalDataSourcekhi bật phần giữ chỗ và tổng kích thước là bội số chính xác của kích thước trang.
Phiên bản 1.0.0-alpha5
Ngày 22 tháng 1 năm 2018
Sửa lỗi
- Khắc phục sự cố tải trang khi trình giữ chỗ bị tắt b/70573345
- Ghi nhật ký bổ sung để theo dõi IllegalArgumentException b/70360195 (và việc sửa lỗi phía Room có tính duy đoán)
- Sửa mã mẫu Javadoc b/70411933, b/71467637