Android 如何在使用RxJava发布数据后从服务器获取响应
在数据成功发布到服务器上后,我尝试使用Reformation2和rxjava2在服务器上发布数据。我希望从服务器获得响应。我使用kotlin,所以如何在我的应用程序中获得服务器响应 这就是我到目前为止所做的: AddHero.ktAndroid 如何在使用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)
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只返回字符串,您需要将可观察的
更改为可观察的