android - 使用 Retrofit 在 Mock Api 中处理错误
问题描述
我正在使用改造和模拟 api 进行测试,我已经有一个 recyclerview,其中包含产品列表和产品的详细信息,同时单击该行,但在某些产品中,josn 是一个错误处理示例:
http://mocklab.io/product/1/
{
"success": true,
"metadata": {
"sku": "2",
"name": "Huawei P20 Pro",
"max_saving_percentage": 30,
"price": 13996,
"special_price": 7990,
"brand": "Huawei",
"rating": {
"average": 4,
"ratings_total": 265
},
但让我们说在我的情况下产品“3”给我错误 json:http:mocklab.io/product/3/
{
"success": false,
"messages": {
"error": {
"reason": "PRODUCT_NOT_FOUND",
"message": "Product not found!"
}
}
}
pojos 已经用 jsonschema2pojo 完成了,所以问题是如果我点击 recyclerview 的第 3 行,我的应用程序崩溃,因为我得到空对象引用,但我想要的是处理他们问的错误:HTTP 200 -成功错误,对不起,如果我没有解释自己最好的方法,谢谢!称呼:
GetPhoneDataService service = RetrofitInstance.getRetrofitInstance().create(GetPhoneDataService.class);
Call<APIReponse> call = service.getAllPhones(1);
call.enqueue(new Callback<APIReponse>() {
@Override
public void onResponse(Call<APIReponse> call, Response<APIReponse> response) {
if (response.isSuccessful() && response.body() != null) {
for (Result result : response.body().getMdata().getResults()) {
phoneList.add(result);
}
adapter.setOnClickListener(new PhonesAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
String sku = phoneList.get(position).getSku();
Intent intent = new Intent(MainActivity.this, DetailsActivity.class);
intent.putExtra("sku", sku);
startActivity(intent);
}
});
adapter.notifyDataSetChanged();
} else {
try {
String error = response.errorBody().string();
if (error != null) {
Log.e("Error : ", error);
}
//show error to the user
} catch (Exception e) {
e.printStackTrace();
}
解决方案
在 Retrofit 中,您可以像这样处理错误响应。内部onResponse
回调:
if (response.isSuccessful()
&& response.body() != null) {
//Call was successful and body has data
} else {
try {
String error = response.errorBody().string();
if(error != null)
//show error to the user
} catch (Exception e) {
e.printStackTrace();
}
}
但是,如果您的错误在这里抛出:
public void onItemClick(int position) {
String sku = phonesList.get(position).getSku();
Log.e("ffff", "----- " + sku);
Intent intent = new Intent(MainActivity.this,DetailsActivity.class);
intent.putExtra("sku", sku);
startActivity(intent);
}
那么你会遇到不能很好地设计代码的问题。当您调用方法时,我不知道您的代码的上下文更准确的上下文,generatePhonesList
但是,如果您需要多次调用它,那么请考虑不要在该方法中设置adapter
和。recyclerview
为此,您有一个叫做:notifyDataSetChanged()
推荐阅读
- javascript - 如何使用 chrome background.js 继续计时器倒计时
- css - Spartacus 3.3 - 如何扩展默认店面主题(Sparta)?
- javascript -
为什么 JavaScript在尝试将其与运算符 OR 的结果连接时会忽略 HTML标签? - android - 使用 Flutter Firebase Firestore 从数据库中获取地理点数据
- reactjs - 如何测试给定的按钮数量是否存在?[reactjs,测试库]
- python - 安装 pytext 时如何解决 caffe 周围的 pytorch 错误?
- c# - async / await 可以用于用户输入吗?
- laravel - 请求缺少必需的参数,包括无效的参数护照身份验证
- icalendar - 一键导入 webcal 到 google/outlook 日历的 url
- reactjs - React useToggle 组件返回 TypeError: Object is not a function or its return value is not iterable