错误在http请求返回错误时处理UI线程

我正在使用Fuel和Rxjava进行网络通话。 我已经将我的基本URL设置为localhost,而不是在服务任何东西。 我想能够处理网络错误,所以我可以在用户界面上显示某种错误信息。

这是我的GET请求的一个例子

fun getRandom(take: Int, responseHandler: (result: WikiResult) -> Unit?) { Urls.getRandomURl(take) .httpGet() .timeout(timeout) .timeoutRead(readTimeout) .rx_object(WikipediaDataDeserializer()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ result -> val statusCode = result.component2()?.response?.statusCode when(statusCode) { -1 -> e(statusCode.toString(), result.component2()?.cause.toString()) else -> { val (data, _) = result responseHandler.invoke(data as WikiResult) } } }, { error -> e(error.cause.toString()) }) } 

在我的片段上,我在异步任务中调用上面的函数

 private fun getRandomArticles() { refresher?.isRefreshing = true wikiManager?.getRandom(15, { wikiResult -> adapter.currentResults.clear() adapter.currentResults.addAll(wikiResult.query!!.pages) onUiThread { adapter.notifyDataSetChanged() refresher?.isRefreshing = false } }) } private fun reportException(e: Throwable) { refresher?.isRefreshing = false val builder = AlertDialog.Builder(activity) builder.setMessage(e.message).setTitle("Error") val dialog = builder.create() dialog.show() } 

所以我得到一个网络错误java.net.ConnectException: Failed to connect to localhost/127.0.0.1:80

我希望能够得到我的片段,并显示在片段上的错误。 不知道最好的办法是什么。

你可以在https://github.com/limpep/android-kotlin-wikipedia下看到分支function/ rxjava下的完整项目代码

任何帮助将非常感激

很难说如何在你的结构中编写好的代码,因为你的代码在分离时不是很清楚,当你已经使用.subscribeOn().observeOn()时,没有必要使用AsyncTaskrunOnUIThread你的可观察的。

也许这将是更好的结构基础:

 fun getRandom(take: Int): Single { return Urls.getRandomURl(take) .httpGet() .timeout(timeout) .timeoutRead(readTimeout) .rx_object(WikipediaDataDeserializer()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .map{ if(it.component2()!=null) throw it.component2() else it.component1() as WikiResult } } private fun getRandomArticles() { refresher?.isRefreshing = true getRandom().doOnCompleted{refresher?.isRefreshing = false} .subscribe(this::handleResponse,this::reportException) } private fun handleResponse(wikiResult:WikiResult){ adapter.currentResults.clear() adapter.currentResults.addAll(wikiResult.query!!.pages) adapter.notifyDataSetChanged() }