You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fuel与RxJava时在UI线程处理网络请求错误的问询

处理Fuel+RxJava网络请求的连接错误并展示UI提示

我来帮你搞定这个问题!你遇到的java.net.ConnectException: Failed to connect to localhost/127.0.0.1:80是典型的服务未启动或地址不可达错误,结合RxJava和Fuel,我们可以优雅地捕获这类错误并在Fragment中安全地更新UI,同时还能替换掉已经废弃的AsyncTask,让代码更符合现代Android开发规范。

第一步:确保引入Fuel的RxJava扩展依赖

首先要确认你的项目里已经添加了Fuel的RxJava适配依赖(比如针对RxJava2/3的版本),这样才能让Fuel的请求返回Observable,方便用RxJava的错误处理机制。

第二步:改造网络请求方法,返回Observable

把你的GET请求改成返回Observable类型,利用RxJava的线程调度处理异步操作,同时在流中提前处理可能的HTTP错误:

import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.rx.rxObject
import io.reactivex.Observable
import io.reactivex.schedulers.Schedulers
import java.net.ConnectException

// 自定义HTTP异常类,方便区分HTTP状态码错误
class HttpException(val statusCode: Int) : RuntimeException("HTTP error code: $statusCode")

// 假设你的响应模型是YourResponseModel,需要实现Deserializer
fun fetchData(): Observable<YourResponseModel> {
    return Fuel.get("/your-api-endpoint") // 基础URL已设为localhost,这里只写接口路径
        .rxObject(YourResponseModel.Deserializer()) // 使用Fuel的Rx扩展解析响应
        .map { result ->
            // 先处理HTTP状态码,非200的情况主动抛出异常
            if (result.statusCode == 200) {
                result.get() // 获取解析后的响应对象
            } else {
                throw HttpException(result.statusCode)
            }
        }
        .subscribeOn(Schedulers.io()) // 指定网络请求在IO线程执行
}

第三步:在Fragment中订阅并处理错误

在Fragment的生命周期方法(比如onViewCreated)中订阅这个Observable,切换到主线程更新UI,并在onError回调中捕获ConnectException和其他错误:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.snackbar.Snackbar
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable

class YourFragment : Fragment() {
    // 用CompositeDisposable管理订阅,避免内存泄漏
    private val compositeDisposable = CompositeDisposable()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        val requestDisposable: Disposable = fetchData()
            .observeOn(AndroidSchedulers.mainThread()) // 切换到主线程处理UI更新
            .subscribe(
                { response ->
                    // 请求成功,更新UI展示数据
                    updateUiWithResponse(response)
                },
                { error ->
                    // 统一捕获所有异常,根据类型展示不同提示
                    when (error) {
                        is ConnectException -> {
                            // 连接失败的情况,给用户友好提示
                            Snackbar.make(
                                requireView(),
                                "无法连接到服务器,请检查服务是否启动或网络状态",
                                Snackbar.LENGTH_LONG
                            ).show()
                        }
                        is HttpException -> {
                            // HTTP状态码错误,比如404、500等
                            Snackbar.make(
                                requireView(),
                                "请求失败,错误码:${error.statusCode}",
                                Snackbar.LENGTH_LONG
                            ).show()
                        }
                        else -> {
                            // 其他未知错误
                            Snackbar.make(requireView(), "发生未知错误,请稍后重试", Snackbar.LENGTH_LONG).show()
                        }
                    }
                }
            )
        
        // 将订阅添加到CompositeDisposable管理
        compositeDisposable.add(requestDisposable)
    }

    override fun onDestroyView() {
        // 页面销毁时清空所有订阅,防止内存泄漏
        compositeDisposable.clear()
        super.onDestroyView()
    }

    private fun updateUiWithResponse(response: YourResponseModel) {
        // 这里写更新UI的逻辑,比如填充RecyclerView、设置TextView等
    }
}

额外提示

  • 如果你是在Android模拟器上测试,localhost指向的是模拟器自身,如果你要访问电脑上的本地服务,应该把基础URL改成http://10.0.2.2:80(Android模拟器的特殊地址);如果是真机,要确保手机和电脑在同一局域网,用电脑的局域网IP地址。
  • 我们替换了AsyncTask,因为RxJava不仅能处理异步,还提供了更强大的线程调度、错误处理和生命周期管理能力,避免了AsyncTask的诸多弊端。

内容的提问来源于stack exchange,提问作者Limpep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:32:07