Android 如何在使用RxJava发布数据后从服务器获取响应

Android 如何在使用RxJava发布数据后从服务器获取响应,android,kotlin,retrofit2,rx-java2,Android,Kotlin,Retrofit2,Rx Java2,在数据成功发布到服务器上后,我尝试使用Reformation2和rxjava2在服务器上发布数据。我希望从服务器获得响应。我使用kotlin,所以如何在我的应用程序中获得服务器响应 这就是我到目前为止所做的: AddHero.kt class AddHero : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

在数据成功发布到服务器上后,我尝试使用Reformation2和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()

   }
}
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
   }

}
interface ApiService {

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

}
data class Hero (

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

        @SerializedName("movie")
        val movie:String
)
客户端.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()

   }
}
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
   }

}
interface ApiService {

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

}
data class Hero (

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

        @SerializedName("movie")
        val movie:String
)
ApiService.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()

   }
}
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
   }

}
interface ApiService {

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

}
data class Hero (

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

        @SerializedName("movie")
        val movie:String
)
有人请让我知道我做错了什么或错过了什么。任何帮助都将不胜感激


谢谢

您的
ApiService
saveHero
函数返回
可观察的
,您应该在subscribe(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) })

别忘了检查对象是否为非空

因此,您订阅了该事件,但如果您想观察响应,您想
doOnNext
我如何观察事件。您看过关于可观察对象的RxJava文档了吗?类似于
saveHero(…).onNext(…).subscribe()
onNext()
的方法是在subscribe下调用的。我在你的问题中没有看到这一点,也不要忘记将api调用设为单个调用,因为它是一个可观察的对象没有任何意义。我想知道你为什么添加了
hero.toString()
Log.d
语句中,它会从服务器得到响应吗?我正在从服务器发送类似
添加的数据的响应。.我添加了日志只是举个例子,你不需要它,你所要做的就是检查你的
Hero
对象的可空性,然后用它做你想做的事it@Dig如果API只返回字符串,您需要将
可观察的
更改为
可观察的