Возникли проблемы при получении данных с помощью библиотеки Android nytimes Store - PullRequest
0 голосов
/ 03 июля 2019

У меня есть следующий код, который я пытаюсь использовать для извлечения данных из конечной точки API, используя библиотеку NyTimes / Store для ее кеширования

Я использую DI для загрузки своих зависимостей следующим образом

  val appModule = module(override = true) {
        single<MyAppDatabase> {
            Room.databaseBuilder(androidApplication(), MyAppDatabase::class.java, "MJiraniRoomDB")
                .fallbackToDestructiveMigration()
                .build()
        }
        //DATABASE ACCESS OBJECTS
        factory<BlogDao> { get<MyAppDatabase>().blogDao() }
        factory<BlogLocalService> { BlogLocalService(get()) }
        factory<BlogRemoteService> { BlogRemoteService(get()) }
        factory<BlogStore> { BlogStore(get(), get()) }

Служба, в которой я использую библиотеку Store с RoomStore, находится здесь

package com.example.myapplication.service.BlogService

import com.example.myapplication.model.Blog
import com.nytimes.android.external.store3.base.Fetcher
import com.nytimes.android.external.store3.base.impl.BarCode
import com.nytimes.android.external.store3.base.impl.MemoryPolicy
import com.nytimes.android.external.store3.base.impl.StalePolicy
import com.nytimes.android.external.store3.base.impl.room.StoreRoom
import com.nytimes.android.external.store3.base.room.RoomPersister
import io.reactivex.Observable
import java.util.concurrent.TimeUnit

class BlogStore(val blogRemoteService: BlogRemoteService, val blogLocalService: BlogLocalService) {

    var fetcher = Fetcher<List<Blog>, BarCode> {
        blogRemoteService.fetchBlogs()
    }

    val persister = object : RoomPersister<List<Blog>, List<Blog>, BarCode> {

        override fun read(barCode: BarCode): Observable<List<Blog>> {
            return blogLocalService.fetchAll().toObservable()
        }

        override fun write(barCode: BarCode, blogList: List<Blog>) {
            blogLocalService.addBlogs(blogList)
        }
    }

    var memoryPolicy: MemoryPolicy = MemoryPolicy
        .builder()
        .setExpireAfterWrite(5)
        .setExpireAfterTimeUnit(TimeUnit.SECONDS)
        .build()

    var store = StoreRoom.from(fetcher, persister, StalePolicy.REFRESH_ON_STALE, memoryPolicy)

    fun getBlogs(): Observable<List<Blog>> {
        store.clear()
        return store.fetch(BarCode.empty())
    }
}

Я перетаскиваю данные в свой Recyclerview следующим образом

class RemotePostsFragment : Fragment() {
    val scopeProvider by lazy { AndroidLifecycleScopeProvider.from(this) }

    val myBlogStore: BlogStore by inject()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        var mRecyclerview = view.findViewById<RecyclerView>(R.id.myRemoteViewRecycler)


        var theAdapter = MyAdapter()
       myBlogStore.getBlogs()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .autoDisposable(scopeProvider)
            .subscribe({ bloglist ->
                theAdapter.blogItems = bloglist
            }, {
                Log.e("RemotePostFragment", "failed got message ${it.message}")
            })


        mRecyclerview.adapter = theAdapter
        mRecyclerview.layoutManager = LinearLayoutManager(this.context)
    }

Проблема в том, что я загружаю только данные из базы данных Android, но они никогда не извлекаются с сервера. Когда я делаю необработанный запрос с сервера, который используется из сборщика, я могу получить список блогов. Но когда я использую его в сборщике, я не могу автоматически синхронизировать.

Мой blogRemoteService корректно возвращает Single> при тестировании самостоятельно. Что я могу делать не так?

1 Ответ

0 голосов
/ 06 июля 2019

Я нашел решение моей проблемы, в моей RoomPersister в методе записи я передавал blogLocalService.addBlogs (blogList), который возвращает Single<List<Blog>>, на который я забыл подписаться. Это то, что у меня было ранее

val persister = object : RoomPersister<List<Blog>, List<Blog>, BarCode> {

        override fun read(barCode: BarCode): Observable<List<Blog>> {
            return blogLocalService.fetchAll().toObservable()
        }

        override fun write(barCode: BarCode, blogList: List<Blog>) {
            blogLocalService.addBlogs(blogList)
        }
    }

Я ошибочно предположил, что метод Singe >> каким-то образом автоматически будет подписан. Это был мой последний код, который работал

val persister = object : RoomPersister<List<Blog>, List<Blog>, BarCode> {

        override fun read(barCode: BarCode): Observable<List<Blog>> {
            return blogLocalService.fetchAll().toObservable()
        }

        override fun write(barCode: BarCode, blogList: List<Blog>) {
            blogLocalService.addBlogs(blogList).
            .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.io())
                    .subscribe({
                    Log.d("BlogLocalService","successful write to db")
                },{
                    Log.d("BlogLocalService","failed to write to db with error: ${it.message}")
                })
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...