Android Retrofit2 универсальный метод - PullRequest
0 голосов
/ 14 апреля 2020

Я использую Retrofit2 для подключения к серверу,

Чтобы упростить количество методов запроса, я использую дженерики. Но проблема в том, что модернизация не принимает метод generi c. Я поместил пример кода ниже. Кто-нибудь знает решение?

Фото 1):

APIInterface

import io.reactivex.Observable
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Path

interface APIInterface {

   @POST("{url}") fun <T> post(
      @Path("url") url: String,
      @Body body: RequestBody
   ): Observable<T>

   @GET("{url}") fun <T> get(
      @Path("url") url: String
   ): Observable<T>
}

Фото 2:

APIService

import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import okhttp3.RequestBody
import java.io.Serializable

class APIService constructor(private val mApi: APIInterface) {

   fun <T: Serializable> post(url: String, body: RequestBody): Observable<T>{
      val observable = mApi.post<T>(url, body)
      observable.subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
      return observable
   }

   fun <T: Serializable> get(url: String): Observable<T> {
      val observable = mApi.get<T>(url)
      observable.subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
      return observable
   }
}

Фото 3:

вызов в контроллере

mAPIService.post<SignUpModel>(URL_SIGN_UP, body)
        .subscribe(object : APIObserver<SignUpModel> {
            override fun onNext(it: SignUpModel) {
    .
    .
    .

Фото 4:

cra sh: (

W: java.lang.IllegalArgumentException: Method return type must not include a type variable or wildcard: io.reactivex.Observable<T>
W: for method APIInterface.post
    .
    .
    .

1 Ответ

0 голосов
/ 14 апреля 2020

Информация о типе должна быть полностью известна во время выполнения, чтобы десериализация работала.

Вы не можете сделать это, информация о типе должна быть полностью stati c, а не generi c, в противном случае модернизация не может корректно генерировать Сервис. Посмотрите на здесь .

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