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

Android使用Retrofit发起网络请求时如何实现响应Toast提示

Android Retrofit请求提示实现问题解答

结论

现有实现不完全正确,存在关键逻辑疏漏,会导致错误提示用户、业务逻辑混乱的问题。

存在的具体问题

  • 缺失响应合法性判断:onResponse仅代表请求的网络交互完成,不代表业务请求成功,服务端返回4xx(参数错误、权限不足)、5xx(服务端崩溃)错误时也会走onResponse回调,此时直接提示"插入成功"并跳转页面完全不符合预期。
  • 失败提示不友好:直接将Throwable的全栈信息通过Toast展示给普通用户,用户无法理解报错内容,体验极差。
  • 未处理页面销毁场景:如果请求回调执行时当前Activity已经被销毁,调用finish()、startActivity()会触发崩溃,最好提前判断页面状态。
  • 缺失业务状态判断:就算响应码是200,服务端也可能在返回的model中返回业务错误(比如你提交的手机号已经被注册),需要额外判断业务状态才能确认操作成功。

优化后实现代码

// Retrofit实例初始化原有逻辑没问题
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(uri)
    .addConverterFactory(GsonConverterFactory.create())
    .build();

ayapi api = retrofit.create(ayapi.class);
Call<model> call = api.adddata(namevalue,numbervalue,emailvalue,countryvalue,statevalue,cityvalue,pincodevalue,addressvalue,teams);

call.enqueue(new Callback<model>() {
    @Override
    public void onResponse(Call<model> call, Response<model> response) {
        // 先判断当前页面是否已经销毁,避免崩溃
        if (isFinishing() || isDestroyed()) {
            return;
        }
        // 先判断HTTP响应码是否在200-299合法区间
        if (response.isSuccessful()) {
            model result = response.body();
            // 这里根据你自己的model结构判断业务是否成功,示例假设model里code字段为0代表成功
            if (result != null && result.getCode() == 0) {
                Toast.makeText(getApplicationContext(),"插入成功",Toast.LENGTH_LONG).show();
                finish();
                startActivity(new Intent(getApplicationContext(),home.class));
            } else {
                // 业务错误,取服务端返回的错误提示或者自定义提示
                String errorMsg = result != null ? result.getMsg() : "操作失败,请稍后重试";
                Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show();
            }
        } else {
            // HTTP层面错误,比如404、500
            Toast.makeText(getApplicationContext(),"请求错误:" + response.code(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onFailure(Call<model> call, Throwable t) {
        if (isFinishing() || isDestroyed()) {
            return;
        }
        // 网络层面错误,比如无网络、超时,给用户友好提示
        Toast.makeText(getApplicationContext(),"网络请求失败,请检查网络后重试",Toast.LENGTH_LONG).show();
        // 开发阶段可以打日志排查问题,不要暴露给普通用户
        // Log.e("RetrofitError", "请求失败", t);
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 07:06:04