如何在Kotlin中使用Reformation和Observables创建异步调用



我想使用Reforming2库进行API调用,返回可观察的泛型类型。

我在打电话时遇到一个错误:android.os.NetworkOnMainThreadException。

看起来真的很容易解决,需要考虑两种情况:1)如果您没有使用RXJava,或者2)如果您使用的是

1)如果您没有使用RXJava

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

以下是一个从网络上获取的例子,该例子使用了Kotlin的Enqueue,您可能可以适应您的情况

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

}

2)如果您正在使用RXJava(通常是第2版,请注意,您会在网上找到第一个版本的几个教程)

但请考虑一下,现在大多数开发人员都使用RXJava2来解决这个异步调用,这是我在文章开头提到的第二种情况你需要几个小时才能理解它的基本知识,但一旦你做到了,你就有了很好的技能,管理这种电话(甚至多个电话)将非常简单。事实上,RXJava允许您非常容易地在并发线程中指导操作,并在主线程上观察结果。这里有一个很好的教程来解释如何做到这一点具有简单且众所周知的模式(参见符号)

Observable<List<TrendsResponse>>
.subscribeOn(Schedulers.io())//Run the call on another Thread
.observeOn(AndroidSchedulers.mainThread())//observe on the Main Thread
.subscribe();

与RXJava新手的想法不同:默认情况下,RXJava不调用并发线程,这取决于您使用执行所有"脏"工作的subcribeOn来执行,然后使用ObserveOn在主线程上观察结果。

原则上很容易理解,将它们与异步任务的两种著名方法doInBackgroundonPostExecute进行比较

编辑:如果你或未来的用户有问题,请看这篇文章。

使用改装/RxJava,默认情况下,网络调用将在订阅存根返回的Observable的线程上执行。在Android上,我们通常在"主"线程上执行,不允许在该线程上访问网络,因此出现错误。

解决方案是告诉RxJava在另一个线程上订阅Observable:

getDataFromAPI(/*...*/)
.subscribeOn(Schedulers.io())
.observerOn(AndroidSchedulers.mainThread())
.subscribe({ /* result available in `it` */ })

Schedulers.io()是对使用一组专门用于IO操作的线程的调度器的引用。

.observeOn允许您在主线程上安全地处理结果。

最新更新