Есть ли способ заставить retrofit2 вернуть LiveData

Просто оставляйте баннер неопределенным и не включается.

1
задан Ali Habbash 16 January 2019 в 03:11
поделиться

2 ответа

Вы можете использовать LiveDataReactiveStreams.

For example:

    fun someMethod(id : Int) : LiveData<List<SomeObject>>{
        return LiveDataReactiveStreams.fromPublisher(
            repository.getDataFromSource(id)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()))
    }

Здесь repository.getDataFromSource () возвращает Flowable.

0
ответ дан EpicPandaForce 16 January 2019 в 03:11
поделиться

Вы должны добавить addCallAdapterFactory(LiveDataCallAdapterFactory()) в Retrofit Adapter.

Я реализовал с помощью Dagger-2: -

@Module(includes = [ViewModelModule::class])
        class AppModule {
        @Singleton
        @Provides
        fun provideGithubService(): GithubService {
            return Retrofit.Builder()
                .baseUrl("YOUR URL")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(LiveDataCallAdapterFactory())
                .build()
                .create(GithubService::class.java)
        }
      }

Создайте класс интерфейса, например GithubService: -

interface GithubService {
    @GET("users/{login}")
    fun getUser(@Path("login") login: String): LiveData<ApiResponse<User>>
}

Внедрите класс GithubService, и тогда вы сможете получить: - [119 ]

githubService.getUser(login)

LiveDataCallAdapterFactory будет выглядеть следующим образом

import androidx.lifecycle.LiveData
import com.android.example.github.api.ApiResponse
import retrofit2.CallAdapter
import retrofit2.CallAdapter.Factory
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

class LiveDataCallAdapterFactory : Factory() {
    override fun get(
            returnType: Type,
            annotations: Array<Annotation>,
            retrofit: Retrofit
    ): CallAdapter<*, *>? {
        if (Factory.getRawType(returnType) != LiveData::class.java) {
            return null
        }
        val observableType = Factory.getParameterUpperBound(0, returnType as ParameterizedType)
        val rawObservableType = Factory.getRawType(observableType)
        if (rawObservableType != ApiResponse::class.java) {
            throw IllegalArgumentException("type must be a resource")
        }
        if (observableType !is ParameterizedType) {
            throw IllegalArgumentException("resource must be parameterized")
        }
        val bodyType = Factory.getParameterUpperBound(0, observableType)
        return LiveDataCallAdapter<Any>(bodyType)
    }
}

Для справки вы можете посмотреть эту ссылку https://github.com/googlesamples/android-architecture-components/tree/master / GithubBrowserSample

0
ответ дан Alok Mishra 16 January 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: