Android 如何使用Kotlin中的改进和可观察项创建异步调用?

Android 如何使用Kotlin中的改进和可观察项创建异步调用?,android,kotlin,retrofit2,Android,Kotlin,Retrofit2,我想使用Reformation2库进行API调用,返回泛型类型observable 我有一个错误:在调用的同时,ANDROID.OS.NETWorkStudioAdxEXP。看起来很容易解决,两个案例要考虑。< /强>:1)如果你不使用RXJava或2),如果你使用它 1)如果您不使用RXJava 您应该在调用时使用该方法。您得到的错误是因为您正在同一线程(主线程)上调用响应 下面是一个使用Kotlin排队的web示例,您可以根据自己的情况进行调整 override fun loadPokemo

我想使用Reformation2库进行API调用,返回泛型类型observable


我有一个错误:在调用的同时,ANDROID.OS.NETWorkStudioAdxEXP。

看起来很容易解决,<强>两个案例要考虑。< /强>:1)如果你不使用RXJava或2),如果你使用它

1)如果您不使用RXJava

您应该在调用时使用该方法。您得到的错误是因为您正在同一线程(主线程)上调用响应

下面是一个使用Kotlin排队的web示例,您可以根据自己的情况进行调整

override fun loadPokemonList(pokemonListListener: PokemonListListener) {


    call = pokemonService.getPokedex();
    call.enqueue(object : Callback<PokeDex> {
        override fun onResponse(call: Call<PokeDex>?, response: Response<PokeDex>?) {

            if (response != null && response.isSuccessful) {
                pokemonListListener.onSuccess(response.body())
            } else {
                pokemonListListener.onFailure(appContext.getString(R.string.error_fetching_data))
            }


        }

        override fun onFailure(call: Call<PokeDex>?, t: Throwable?) {
            pokemonListListener.onFailure(appContext.getString(R.string.error_fetching_data))
        }
    })


 }
override fun loadPokemonList(pokemonListListener:pokemonListListener){
call=pokemonService.getPokedex();
排队(对象:Callback{
覆盖fun onResponse(调用:调用?,响应:响应?){
if(response!=null&&response.issessful){
pokemonListListener.onSuccess(response.body())
}否则{
pokemonListListener.onFailure(appContext.getString(R.string.error_fetching_data))
}
}
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
pokemonListListener.onFailure(appContext.getString(R.string.error_fetching_data))
}
})
}
2)如果您使用的是RXJava(通常是第2版,请注意,您会在网上找到一些关于第1版的教程)

但请考虑,现在的大多数开发人员使用RXJava2解决这个异步调用,这是我在帖子开始时提到的第二个例子。strong>您需要几个小时才能理解基本的,但一旦理解了,您将拥有强大的技能,管理此类电话(甚至多次)将非常简单。事实上,RXJava允许您非常轻松地在并发线程中指导操作,并在主线程上观察结果。这里有一个很好的教程,解释了如何 使用简单且众所周知的模式(参见符号)

可观察
.subscribeOn(Schedulers.io())//在另一个线程上运行调用
.observeOn(AndroidSchedulers.mainThread())//在主线程上观察
.subscribe();
与RXJava新手的想法不同: 默认情况下,RXJava不调用并发线程,这取决于您使用执行所有“脏”工作的
子脚本
,然后使用
ObserveOn在主线程上观察结果

对于principiants来说,将它们与AsyncTask的两种著名方法进行比较很容易理解:
doInBackground
onPostExecute


编辑:如果您或未来的用户有问题,请查看此信息。

使用改型/RxJava,网络调用将默认在订阅存根返回的可观察线程上执行。在Android上,我们通常在“主”线程上执行,并且不允许在此线程上访问网络,因此出现错误

解决方案是让RxJava订阅另一个线程上的Observable:

getDataFromAPI(/*...*/)
  .subscribeOn(Schedulers.io())
  .observerOn(AndroidSchedulers.mainThread())
  .subscribe({ /* result available in `it` */ })
Schedulers.io()
是对使用一组专门用于io操作的线程的调度程序的引用


<> >代码> >观察> <代码>允许您安全地返回到主线程上。

订阅另一个线程。以使返回类型泛型,我使用的是观察值——如果不是帮助,您可以考虑接受哪些响应。我的API调用为:@ GET(“/路径/ / /结束/点”)乐趣GETDATAOFAPI。(@QueryMap参数:HashMap):Observable未获得enqueue调用。好的,您使用RXJava是因为您有一个
Observable
!当您从API获取数据时,添加上面显示的两行
subscribeOn
ObserveOn
。如果您有问题,它将起作用。学习随附的教程非常适合学习。谢谢Trocchieto!您是真的LLY欢迎@ S.thaCUR,请考虑我在最后编辑的链接,有人有同样的问题,请阅读我应该使用的库版本,以获得“RealRx.Android。调度程序。ANDRODIDER”。我使用的是“IO。ReActux.Rxjava2:RxJava:2.0.1”(它没有Rx.Android)。尝试添加AndroidSchedulers.mainThread()时出错?我使用的是io.reactivex.rxjava2:rxjava.2.x.x和io.reactivex.rxjava2:rxandroid:2.x.x.@s.thakur确保没有包含另一个(1.x?)版本的rxandroid,并且导入来自
import io.reactivex.android.schedulers.AndroidSchedulers;
getDataFromAPI(/*...*/)
  .subscribeOn(Schedulers.io())
  .observerOn(AndroidSchedulers.mainThread())
  .subscribe({ /* result available in `it` */ })