>

코 틀린 언어로 새로운 페이징 라이브러리를 사용하는 방법을 배우려고 2 일이 지났습니다.

그래서 많은 가이드/튜토리얼과 Github 저장소를 읽었습니다 ( https : // 이 페이징 라이브러리를 구현하기위한 github.com/STAR-ZERO/paging-retrofit-sample ) 기본적으로 내 문제는 내 LiveData<PagedList<Discover>> 입니다  내 ViewModel 내부  API 호출이 종료되기 전에 트리거되고 이유를 모르겠으며 전화를 느낍니다. callback.onResult(it?.results.orEmpty(), null, 2)  아무것도하지 않습니다

이 버전을 사용하고 있습니다 android.arch.paging:runtime:1.0.1 내 프로젝트의 저장소는 여기에서 찾을 수 있습니다 : https://github.com/florian-do/TMDB

logcat :

D/DataSourceFactory: : create()
D/SequentialDataSource: loadInitial:
D/Interceptor: https://api.themoviedb.org/3/discover/movie?api_key=??
D/MainFragment: : observe 0
D/SequentialDataSource: response code -> 200
D/SequentialDataSource: list size: 20

여기에 내 코드가 있습니다 :

Fragment.kt

   val adapter = DiscoverAdapter(context!!, diffCallBack)
    binding.rvFeed.layoutManager = GridLayoutManager(context, 3)
    binding.rvFeed.setHasFixedSize(true)
    binding.rvFeed.adapter = adapter
    viewModel.data.observe(this, Observer {
        Log.d(TAG, ": observe "+it?.size)
    })

MainViewModel.kt

class MainViewModel : ViewModel() {
    var amount = ObservableField<String>()
    val data : LiveData<PagedList<Discover>>
    init {
        val config = PagedList.Config.Builder()
                .setPageSize(20)
                .setEnablePlaceholders(false)
                .build()
        val api : DiscoverService = App.retrofit.create(DiscoverService::class.java)
        val dataSourceFactory = DataSourceFactory(api)
        data = LivePagedListBuilder(dataSourceFactory, config).build()
    }
}

DataSourceFactory.kt

class DataSourceFactory(api: DiscoverService) : DataSource.Factory<Int, Discover>() {
    val source = SequentialDataSource(api)
    override fun create(): DataSource<Int, Discover> {
        return source
    }
}

SequentialDataSource.kt

class SequentialDataSource(val api : DiscoverService) : PageKeyedDataSource<Int, Discover>() {
    private val TAG = "SequentialDataSource"
    override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, Discover>) {
        Log.d(TAG, "loadInitial: ")
        api.getDiscover(TMDBClient.API_KEY).enqueue(object : Callback<DiscoverReponse> {
            override fun onFailure(call: Call<DiscoverReponse>, t: Throwable) {
                Log.d(TAG, ": FAIL")
            }
            override fun onResponse(call: Call<DiscoverReponse>, response: Response<DiscoverReponse>) {
                Log.d(TAG, ": response code -> "+response.code())
                val it = response.body();
                Log.d(TAG, "list size: "+it?.results?.size)
                response.body()?.let {
                    callback.onResult(it.results, null, 2)
                }
            }
        })
    }
    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, Discover>) {
        Log.d(TAG, "loadAfter: "+params.key)
    }
    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, Discover>) {
        Log.d(TAG, "loadBefore: "+params.key)
    }
}

  • 답변 # 1

    글쎄, 많은 변경 후 문제를 해결하는 무언가를 찾았지만 너무 이상합니다. enqueue 를 사용하면  Retrofit 2.3에서는 작동하지 않지만 .execute() 를하면  LiveData가 올바르게 트리거됩니다

    누군가이 문제에 대해 더 잘 설명해 주시면 매우 환영합니다!

    편집 : 방금 Paging library overview 를 읽었습니다.  안드로이드 웹 사이트의 페이지와 나는 이것을 발견했다 :

    와이즈 비즈

  • 답변 # 2

    To display data from a backend server, use the synchronous version of the Retrofit API to load information into your own custom DataSource object.

    loadInitial() loadAfter()  이미 비동기입니다. 당신이 loadBefore() 하려고하면  당신은 println(Thread.currentThread().name) 를 얻을 것이다 . 이 문제를 해결하려면 콜백을 놓치지 않도록 동기 코드를 실행해야합니다.

    arch_disk_io_0

관련 자료

  • 이전 r - 백 슬래시로 문자열/경로를 자동으로 처리하는 방법은 무엇입니까?
  • 다음 cas sso"mvn package"목표 orgapachemavenplugins - maven-war-plugin : 211 : war를 실행하지 못했습니다