欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?Hilt?Retrofit?Paging3使用實(shí)例

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

效果視頻

簡述

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

 //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ù)引用,此內(nèi)容需要在協(xié)程中使用

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

網(wǎng)絡(luò)實(shí)例

提供三個(gè)實(shí)例,最終外部需要引用的的為UseCase的實(shí)例,具體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提供的實(shí)例中,UseCase中實(shí)現(xiàn)了訪問網(wǎng)絡(luò)接口的任務(wù)

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

我們主要實(shí)現(xiàn)load方法;其中page為當(dāng)前內(nèi)容頁數(shù),pageSize為每頁需要加載的內(nèi)容數(shù)量(可在外部進(jìn)行定義),repository為獲取的網(wǎng)絡(luò)數(shù)據(jù)實(shí)體,previousPage為前一頁,此處做了一個(gè)判斷,如果為第一頁時(shí),則返回null,否則進(jìn)行滑動(dòng)至上一頁;nextPage為下一頁, LoadResult.Page為分頁加載所需的內(nèi)容; 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 //當(dāng)前頁,默認(rèn)第一頁
           val pageSize = params.loadSize //每頁數(shù)據(jù)條數(shù)
           val repository = useCase.getProjects(page,pageSize) //獲取的數(shù)據(jù)源
           val repositoryItem = repository.beans //獲取的數(shù)據(jù)列表
           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

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

@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ù)據(jù)

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

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

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

我們此處主要使用refreshappend;

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

然后,在append中監(jiān)聽loadingError兩種狀態(tài),在其loading是顯示底部加載狀態(tài),在Error中顯示底部錯(cuò)誤提示,此處不同于refreshError狀態(tài),因?yàn)橛辛藬?shù)據(jù),就不在需要顯示全屏錯(cuò)誤提示,在數(shù)據(jù)列表底部顯示錯(cuò)誤狀態(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{
                        /**
                         * 全屏顯示錯(cuò)誤*/
                        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){
                    /**
                     * 底部顯示加載錯(cuò)誤*/
                    item { failed(){datas.retry()} }
                }
            }
        }
    }
}

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

相關(guān)文章

  • Android程序結(jié)構(gòu)簡單講解

    Android程序結(jié)構(gòu)簡單講解

    在本篇文章里小編給大家分享一篇關(guān)于Android程序結(jié)構(gòu)的簡單說明內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。
    2019-02-02
  • Android ViewFlipper用法實(shí)例分析

    Android ViewFlipper用法實(shí)例分析

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

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

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

    Android中的android:layout_weight使用詳解

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

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

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

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

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

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

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

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

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

    Android處理時(shí)間各種方法匯總

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

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

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

最新評(píng)論