Есть ли способ заставить retrofit2 вернуть LiveData - PullRequest
0 голосов
/ 16 января 2019

Есть ли способ заставить retrofit2 возвращать liveata вместо Observable?

Если это возможно, как мы можем реализовать этот подход?

Если это невозможно, рекомендуется ли сделать возврат дооборудования Наблюдаемым, а затем преобразовать его в Ливата?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вы должны добавить addCallAdapterFactory(LiveDataCallAdapterFactory()) в модифицированном адаптере.

Я реализовал с помощью 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, и тогда вы можете получить: -

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 голосов
/ 16 января 2019

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...