【问题标题】:Error handling using volley in android在 android 中使用 volley 进行错误处理
【发布时间】:2018-05-04 12:27:39
【问题描述】:

我想在 android 中使用volley 打印来自onErrorResponse 的错误,我想在不同的textview 中打印它们separately

onErrorResponse 我的错误

{
    "message": "422 Unprocessable Entity",
    "error": {

      "username": [
            "The username has already been taken."
        ],
        "email": [
            "The email has already been taken."
        ]
    },
    "status_code": 422
}

所以我想单独打印它们, 我的意思是The username has already been taken. 在一个textviewThe email has already been taken. 在第二个textview。谢谢

我的代码:

public void postData(JSONObject jsonObject) {       
    String url = "http://www.xxxxxxxx.com/api/v1/auth/register";
    String REQUEST_TAG = "volley_key";      
    JsonObjectRequest jsonObjectReq = new JsonObjectRequest(Request.Method.POST, url, jsonObject,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        verifyResponse(response);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {            
            NetworkResponse networkResponse = error.networkResponse;
            if (networkResponse != null && networkResponse.data != null) {
                String errorStr = new String(networkResponse.data);                  
                try {
                    JSONObject jObj = new JSONObject(errorStr);
                    JSONObject objError = jObj.getJSONObject("error");
                    JSONArray emailArray = objError.getJSONArray("email");
                    if (emailArray != null) {
                        String emailMessage = String.valueOf(emailArray.get(0));
                        Toast.makeText(getApplication(), emailMessage, Toast.LENGTH_LONG).show();
                    }
                    JSONArray usernameArray = objError.getJSONArray("username");
                    if (usernameArray != null) {
                        String usernameMessage = String.valueOf(emailArray.get(0));
                        Toast.makeText(getApplication(), usernameMessage, Toast.LENGTH_LONG).show();
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }){
        @Override
        protected VolleyError parseNetworkError(VolleyError volleyError) {

            if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) {
                VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
                volleyError = error;
            }
            return volleyError;
        }
    };      VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(jsonObjectReq, REQUEST_TAG);
}

【问题讨论】:

  • 好的...解析你的json并设置TextView...有什么问题?
  • 我没有回答这个问题,但The name field is required. 可能这应该由客户端完成。 The email has already been taken. 这很好。
  • @Wizard,好的,我想打印“用户名已被占用”,电子邮件已被占用。谢谢
  • @cricket_007 我知道如何在 onResponse 中解析 josn。但是如何解析错误?
  • 完全一样的想法。请展示您的尝试

标签: android json error-handling android-volley


【解决方案1】:

将 ErrorModel.class 和 Error 类添加到 java 文件夹中。

package co.exmaple;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class ErrorModel {

    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("error")
    @Expose
    private Error error;
    @SerializedName("status_code")
    @Expose
    private Integer statusCode;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Error getError() {
        return error;
    }

    public void setError(Error error) {
        this.error = error;
    }

    public Integer getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(Integer statusCode) {
        this.statusCode = statusCode;
    }

}

错误类

package co.exmaple;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Error {

    @SerializedName("name")
    @Expose
    private List<String> name = null;
    @SerializedName("username")
    @Expose
    private List<String> username = null;
    @SerializedName("email")
    @Expose
    private List<String> email = null;

    public List<String> getName() {
        return name;
    }

    public void setName(List<String> name) {
        this.name = name;
    }

    public List<String> getUsername() {
        return username;
    }

    public void setUsername(List<String> username) {
        this.username = username;
    }

    public List<String> getEmail() {
        return email;
    }

    public void setEmail(List<String> email) {
        this.email = email;
    }

}

然后在 StringError Request 中设置 Error 文本到 texView 中。

StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {



            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
 GsonBuilder gsonBuilder = new GsonBuilder();
                Gson gson = gsonBuilder.create();
                ErrorModel error = gson.fromJson(response,ErrorModel.class);
                recyclerView.setAdapter(new ErrorAdapter(ErrorActivity.this,error.getError));
            }
        });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);

制作 RecyclerView 适配器以将错误文本设置为 TextView

【讨论】:

    【解决方案2】:

    您可以检查错误对象中的键,只需检查键是否存在,然后显示特定 Textview 的错误。 这里是一个例子。我以你使用 JsonObject 的凌空类为例,即响应在 JsonObject 中。

    JsonObject obj=response.getAsJsonObject("error");
    if(obj.has("name")){
        nameTextView.setText(obj.getAsJsonArray("name").get(0)+"");
    }
    if(obj.has("username")){
        usernameTextView.setText(obj.getAsJsonArray("username").get(0)+"");
    }
    if(obj.has("email")){
        emailTextView.setText(obj.getAsJsonArray("email").get(0)+"");
    }
    

    【讨论】:

    • 你的代码有很多语法错误(右括号,缺少双引号)纠正它
    • @Chandan Bhandari 兄弟请纠正它,它不起作用。
    猜你喜欢
    • 2015-10-07
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2011-09-18
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多