Как получить ответ от сервера после публикации данных с использованием RxJava - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь опубликовать данные на сервере с помощью retrofit2 и rxjava2 после того, как данные успешно отправлены на сервер. Я хочу получить ответ от сервера. Я использую kotlin, так как я могу получить ответ сервера в своем приложении.

Это то, что я сделал до сих пор:

AddHero.kt

class AddHero : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_add_hero)

    addHero.setOnClickListener {

        if(hero.text.toString().equals("")){

            Toast.makeText(applicationContext,"Enter superhero name",Toast.LENGTH_SHORT).show()
        }
        else if(movie.text.toString().equals("")){

            Toast.makeText(applicationContext,"Enter movie name",Toast.LENGTH_SHORT).show()
        }
        else{

            saveData()
        }
    }

}

private fun saveData() {

    RetrofitClient.create().saveHero(hero.text.toString(),movie.text.toString())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe()

   }
}

RetrofitClient.kt

object RetrofitClient {

fun create():ApiService{

    val okHttpClient = OkHttpClient.Builder()
                       .connectTimeout(12,TimeUnit.SECONDS)
                       .readTimeout(12,TimeUnit.SECONDS)
                       .writeTimeout(12,TimeUnit.SECONDS)
                       .build()

   val retrofit = Retrofit.Builder()
               .baseUrl("https://www.example.com")
               .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
               .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
               .client(okHttpClient)
               .build()

    val service = retrofit.create(ApiService::class.java)
    return service
   }

}

ApiService.kt

interface ApiService {

@POST("createHero")
@FormUrlEncoded
fun saveHero(@Field("name") name:String,
             @Field("movie") movie:String):Observable<Hero>

}

Hero.kt

data class Hero (

        @SerializedName("name")
        val name:String,

        @SerializedName("movie")
        val movie:String
)

Кто-то, пожалуйста, дайте мне знать, что я делаю неправильно или отсутствует. Любая помощь будет оценена.

СПАСИБО

1 Ответ

0 голосов
/ 02 октября 2019

Ваша ApiService saveHero функция возвращает Observable<Hero>, вы должны получить свой ответ в подписке (onNext, onError), например:

RetrofitClient.create().saveHero(hero.text.toString(), movie.text.toString())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({ hero -> Log.d("AddHeroTag", hero.toString()) },
                { error -> Log.e("AddHero", error.message, error) })

И не забудьте проверить, если вашобъект не нулевой

...