亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android?Hilt?Retrofit?Paging3使用實例

 更新時間:2023年01月16日 14:37:37   作者:FranzLiszt1847  
這篇文章主要介紹了Android?Hilt依賴注入的使用,首先,某個類的成員變量稱為依賴,如若此變量想要實例化引用其類的方法,可以通過構造函數(shù)傳參或者通過某個方法獲取對象,此等通過外部方法獲取對象實例的稱為依賴注入

效果視頻

簡述

本Demo采用Hilt+Retrofit+Paging3完成,主要為了演示paging3分頁功能的使用,下列為Demo所需要的相關依賴

 //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    //paging
    implementation 'androidx.paging:paging-runtime:3.1.1'
    implementation 'androidx.paging:paging-compose:1.0.0-alpha14'
    //Dagger - Hilt
    implementation("com.google.dagger:hilt-android:2.44")
    kapt("com.google.dagger:hilt-android-compiler:2.44")
    // Compose dependencies
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1"
    implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
    // Coroutines
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'

Hilt+Retrofit

訪問接口

定義需要訪問的接口,此接口是Github api,suspend字段用于提示后續(xù)引用,此內容需要在協(xié)程中使用

interface GithubService {
    @GET("search/repositories?sort=stars&q=Android")
    suspend fun queryGithubAsync(@Query("per_page")number:Int, @Query("page") page:Int):DetailsBean
}

網絡實例

提供三個實例,最終外部需要引用的的為UseCase的實例,具體Hilt依賴注入此處不予說明,有意者可參考Hilt依賴注入

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    const val BASE_URL:String = "https://api.github.com/"
    @Singleton
    @Provides
    fun providerRetrofit():Retrofit{
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
    @Singleton
    @Provides
    fun providerGithubService(retrofit: Retrofit): GithubService {
        return retrofit.create(GithubService::class.java)
    }
    @Singleton
    @Provides
    fun providerUseCase(service: GithubService):UseCase{
        return UseCase(GetProjects(service))
    }
}

在Hilt提供的實例中,UseCase中實現(xiàn)了訪問網絡接口的任務

data class UseCase(
    val getProjects: GetProjects
)
class GetProjects(private val service: GithubService) {
    suspend operator fun invoke(number:Int,page:Int): DetailsBean {
        return service.queryGithubAsync(number, page)
    }
}

PagingSource

我們主要實現(xiàn)load方法;其中page為當前內容頁數(shù),pageSize為每頁需要加載的內容數(shù)量(可在外部進行定義),repository為獲取的網絡數(shù)據實體,previousPage為前一頁,此處做了一個判斷,如果為第一頁時,則返回null,否則進行滑動至上一頁;nextPage為下一頁, LoadResult.Page為分頁加載所需的內容; LoadResult.Error可捕獲異常

class DataPagingSource(private val useCase: UseCase):PagingSource<Int,DetailBean>() {
    override fun getRefreshKey(state: PagingState<Int, DetailBean>): Int? = null
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, DetailBean> {
       return try {
           val page = params.key ?: 1 //當前頁,默認第一頁
           val pageSize = params.loadSize //每頁數(shù)據條數(shù)
           val repository = useCase.getProjects(page,pageSize) //獲取的數(shù)據源
           val repositoryItem = repository.beans //獲取的數(shù)據列表
           val previousPage = if (page > 1) page - 1 else null //前一頁
           val nextPage = if (repositoryItem.isNotEmpty()) page+1 else null //下一頁
           Log.d("hiltViewModel","page=$page size=$pageSize")
           LoadResult.Page(repositoryItem,previousPage,nextPage)
       }catch (e:Exception){
           LoadResult.Error(e)
       }
    }
}

ViewModel

在構造函數(shù)中調用Hilt構造的實例;其中getData方法為獲取分頁的數(shù)據,返回為Flow<PagingData<DetailBean>>類型,其中Flow<PagingData<...>>外部為固定寫法,內部可根據需要自行定義,然后PagingConfig的配置中,我們需要配置pageSizeinitialLoadSize,如果不定義后者,則通過每頁內容數(shù)量會是pageSize的三倍,然后添加我們上述創(chuàng)建的PagingSource;最后轉化為流,然后置于協(xié)程中,它緩存PagingData,以便此流的任何下游集合都將共享相同的數(shù)據

@HiltViewModel
class HomeViewModel @Inject constructor(private val useCase: UseCase):ViewModel() {
    val PAGE_SIZE = 10
    fun getData():Flow<PagingData<DetailBean>>{
        return Pager(
            config = PagingConfig(pageSize = PAGE_SIZE, initialLoadSize = PAGE_SIZE),
            pagingSourceFactory = { DataPagingSource(useCase) }
        ).flow.cachedIn(viewModelScope)
    }
}

View

獲取ViewModel中的數(shù)據

val datas = viewModel.getData().collectAsLazyPagingItems()

同時如果需要添加底部刷新狀態(tài)欄、數(shù)據錯誤等標識,需要監(jiān)聽loadState,其狀態(tài)總共分為五種:

  • refresh:第一次加載數(shù)據觸發(fā)
  • prepend:滑動上一頁觸發(fā)
  • append:滑動下一頁觸發(fā)
  • source:對應于[PagingSource]中的加載
  • mediator:對應于來自[RemoteMediator]的加載

我們此處主要使用refreshappend;

其中,在refresh中進行監(jiān)聽,如果然后數(shù)據為null,則顯示全屏錯誤提示,此處為第一次加載數(shù)據;

然后,在append中監(jiān)聽loadingError兩種狀態(tài),在其loading是顯示底部加載狀態(tài),在Error中顯示底部錯誤提示,此處不同于refreshError狀態(tài),因為有了數(shù)據,就不在需要顯示全屏錯誤提示,在數(shù)據列表底部顯示錯誤狀態(tài)欄即可

@Composable
fun GithubList(viewModel: HomeViewModel = hiltViewModel()){
    val datas = viewModel.getData().collectAsLazyPagingItems()
    LazyColumn(
        verticalArrangement = Arrangement.spacedBy(10.dp),
        modifier = Modifier
            .background(grey)
            .fillMaxSize()
            .padding(10.dp)
    ){
        when(datas.loadState.refresh){
            is LoadState.Loading-> {item {  loading() }}
            is LoadState.Error-> {
                if (datas.itemCount <= 0){
                    item{
                        /**
                         * 全屏顯示錯誤*/
                        failedScreen() {
                            datas.retry()
                        }
                    }
                }
            }
        }
        itemsIndexed(datas){ _, value ->
            if (value != null){
                GithubItem(value)
            }else{
                empty {
                    datas.retry()
                }
            }
        }
        when(datas.loadState.append){
            is LoadState.NotLoading-> {}
            is LoadState.Loading-> {
                item {
                    loading()
                }
            }
            is LoadState.Error-> {
                if (datas.itemCount > 0){
                    /**
                     * 底部顯示加載錯誤*/
                    item { failed(){datas.retry()} }
                }
            }
        }
    }
}

到此這篇關于Android Hilt Retrofit Paging3使用實例的文章就介紹到這了,更多相關Android Hilt Retrofit Paging3內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android程序結構簡單講解

    Android程序結構簡單講解

    在本篇文章里小編給大家分享一篇關于Android程序結構的簡單說明內容,有需要的朋友們跟著學習下。
    2019-02-02
  • Android ViewFlipper用法實例分析

    Android ViewFlipper用法實例分析

    這篇文章主要介紹了Android ViewFlipper用法,結合實例形式分析了ViewFlipper圖片操作的相關技巧,需要的朋友可以參考下
    2016-01-01
  • Android使用RSA加密實現(xiàn)接口調用時的校驗功能

    Android使用RSA加密實現(xiàn)接口調用時的校驗功能

    這篇文章主要介紹了Android+Java使用RSA加密實現(xiàn)接口調用時的校驗功能,幫助大家更好的利用Android進行開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • Android中的android:layout_weight使用詳解

    Android中的android:layout_weight使用詳解

    layout_weight的作用是設置子空間在LinearLayout的重要度(控件的大小比重)。layout_weight的值越低,則控件越重要,下面為大家介紹下具體的使用方法
    2013-06-06
  • Android實現(xiàn)QQ圖片說說照片選擇效果

    Android實現(xiàn)QQ圖片說說照片選擇效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)QQ圖片說說照片選擇效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android中Fragment相互切換間不被回收的實現(xiàn)方法

    Android中Fragment相互切換間不被回收的實現(xiàn)方法

    這篇文章主要給大家介紹了關于Android中Fragment相互切換間不被回收的實現(xiàn)方法,文中給出了詳細的示例代碼和注釋供大家參考學習,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • Android 實現(xiàn)左滑出現(xiàn)刪除選項

    Android 實現(xiàn)左滑出現(xiàn)刪除選項

    滑動刪除的部分主要包含兩個部分, 一個是內容區(qū)域(用于放置正常顯示的view),另一個是操作區(qū)域(用于放置刪除按鈕)。下面通過本文給大家介紹Android 實現(xiàn)左滑出現(xiàn)刪除選項,需要的朋友可以參考下
    2017-06-06
  • AndroidStudio升級4.1坑(無法啟動、插件plugin不好用、代碼不高亮)

    AndroidStudio升級4.1坑(無法啟動、插件plugin不好用、代碼不高亮)

    這篇文章主要介紹了AndroidStudio升級4.1坑(無法啟動、插件plugin不好用、代碼不高亮),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Android處理時間各種方法匯總

    Android處理時間各種方法匯總

    這篇文章主要匯總了Android處理時間的各種方法,如何獲取當前時間,日期之間的比較,如何計算兩段日期的重合日期等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android實現(xiàn)拍照和錄制視頻功能

    Android實現(xiàn)拍照和錄制視頻功能

    這篇文章主要為大家詳細介紹了Android實現(xiàn)拍照和錄制視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論