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

Sum*_*t T 4 android kotlin retrofit2

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

我收到一个错误:android.os.NetworkOnMainThreadException,同时进行调用.

tro*_*tto 9

看起来真的很容易解决,需要考虑两种情况.: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方法进行比较:doInBackgroundonPostExecute

编辑:如果您或将来的用户有问题,请查看此帖.