首页 > 解决方案 > 使用 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();
                    }

标签: androidjsonretrofit

解决方案


在 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()


推荐阅读