Sum*_*t T 4 android kotlin retrofit2
我想使用Retrofit2库进行API调用,返回泛型类型observable.
我收到一个错误:android.os.NetworkOnMainThreadException,同时进行调用.
看起来真的很容易解决,需要考虑两种情况.:1)如果您不使用RXJava或2)如果您正在使用它
1)如果您不使用RXJava
您应该在拨打电话时使用方法入队.您得到的错误是因为您在同一个线程(MainThread)上调用响应
以下是使用Enqueue with Kotlin的网络示例,可能您可以适应您的情况
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))
}
})
}
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
不同于RXJava新手的想法:
在默认情况下,RXJava不会调用并发线程,由你来完成subcribeOn所有"脏"工作,然后在主线程上观察结果ObserveOn.
对于主体来说,很容易理解将它们与两种着名的AsyncTask方法进行比较:doInBackground和onPostExecute
编辑:如果您或将来的用户有问题,请查看此帖.
| 归档时间: |
|
| 查看次数: |
3088 次 |
| 最近记录: |