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
相关产品推荐
相关产品推荐

