首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓Volley Request Identity onErrorResponse专区

安卓Volley Request Identity onErrorResponse专区
EN

Stack Overflow用户
提问于 2016-07-25 19:15:21
回答 7查看 1.5K关注 0票数 12
代码语言:javascript
运行
复制
public void getTestDats(String unique_id) {
    final String tag = "testList";
    String url = Constants.BASE_URL + "test_module.php";
    Map<String, String> params = new HashMap<String, String>();
    params.put("user_id", SharedPreferenceUtil.getString(Constants.PrefKeys.PREF_USER_ID, "1"));
    params.put("unique_id", unique_id);//1,2,3,4,5
    DataRequest loginRequest = new DataRequest(Method.POST, url, params, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            switch (response.optInt("unique_id")) {
                case 1:
                    //task 1
                    break;
                case 2:
                    //task 2
                    break;
                default:
                    //nothing
            }
        }
    }, new ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
                //I want to know which unique_id request is failed 
        }
    });
    loginRequest.setRetryPolicy(new DefaultRetryPolicy(20000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    AppController.getInstance().addToRequestQueue(loginRequest, tag);
} 

我正在尝试使用unique_id来识别哪个请求失败了。

我用unique_id调用getTestDats("1")函数。和函数调用10次,所有的接口调用都在addToRequestQueue中。

当API走向成功时,它的部分工作是按照代码进行的。但是当API进入错误部分时,我没有识别请求。有没有办法知道我的请求参数,以便我可以重试特定的unique_id请求。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-07-28 13:28:20

loginRequest中设置字段,在onErrorResponse中像loginRequest.getUniqueId()一样访问该字段

或者,创建实现Response.Listener和ErrorListener的单独类

响应监听器类:

代码语言:javascript
运行
复制
public class MyReponseListener implements Response.Listener<JSONOBject>{
    private long uniqId;
    public MyResponseListener(long uniqId){
        this.uniqId = uniqId;
    }

    @Override
    public void onResponse(JSONObject response) {
        System.out.println("response for uniqId " + uniqId);
        // do your other chit chat
    }
}

ErrorListener类:

代码语言:javascript
运行
复制
public class MyErrorListener implements ErrorListener{
        private long uniqId;
        public MyErrorListener(long uniqId){
            this.uniqId = uniqId;
        }

        @Override
        public void onErrorResponse(VolleyError error) {
             System.out.println("Error for uniqId : " + uniqId);
        }
}

现在这样称呼它:

代码语言:javascript
运行
复制
DataRequest loginRequest = new DataRequest(Method.POST, url, params, new MyResponeListener(uniqId), new MyErrorListener(uniqId));

现在,如果您希望在ErrorListener类中可以访问调用类的一些代码,请执行以下操作: 1.在调用类中,将要访问的代码放在方法中2.使用这些方法创建一个接口3.调用类将实现该接口4.将该接口传递给MyErrorListener或MyResponseListener的构造函数

例如,一个活动调用volley请求,在出错时,您希望显示一条消息。将显示错误代码放在一个方法中:

代码语言:javascript
运行
复制
public void showMessage(int errorCode){
    //message according to code
}

现在创建一个接口

代码语言:javascript
运行
复制
public interface errorMessageInterface{
    void showMessage(int errorCode);
}

activity将实现errorMessageInterface并将其传递给MyErrorListener的构造函数,并将其保存在field中。

onErrorResponse内部,您将调用

代码语言:javascript
运行
复制
field.showMessage()
票数 3
EN

Stack Overflow用户

发布于 2016-07-30 07:34:40

您可以使用与解析成功响应相同的方式来解析错误响应。我在我的项目中使用类似的解决方案。

代码语言:javascript
运行
复制
public class VolleyErrorParser {
    private VolleyError mError;
    private String mBody;
    private int mUniqueId = -1;
    public VolleyErrorParser(VolleyError e){
        mError = e;
        parseAnswer();
        parseBody();
    }

    private void parseBody() {
        if (mBody==null)
            return;
        try{
            JSONObject response = new JSONObject(mBody);
            mUniqueId = response.getOptInt("unique_id");

        }catch (JSONException e){
            e.printStackTrace();
        }
    }

    private void parseAnswer() {
        if (mError!=null&&mError.networkResponse!=null&&mError.networkResponse.data!=null){
            mBody = new String(mError.networkResponse.data);
        }
    }
    public String getBody(){
        return mBody;
    }
    public int getUniqueId(){
        return mUniqueId;
    }
}

使用:

代码语言:javascript
运行
复制
...
, new ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            int id = new VolleyErrorParse(error).getUniqueId();
            switch (id) {
                case -1:
                     //unique id not found in the answer
                     break;
                case 1:
                    //task 1
                    break;
                case 2:
                    //task 2
                    break;
                default:
                    //nothing
            }        
        }
    }
...
票数 3
EN

Stack Overflow用户

发布于 2016-07-28 13:08:06

只需在onError()方法中添加此代码,以确定您正在facing.Add这是哪种类型的错误:

代码语言:javascript
运行
复制
         if (error instanceof TimeoutError) {
            Log.e(TAG, "TimeoutError");
        } else if (error instanceof NoConnectionError) {
            Log.e(TAG,"tNoConnectionError");
        } else if (error instanceof AuthFailureError) {
            Log.e(TAG,"AuthFailureError");
        } else if (error instanceof ServerError) {
            Log.e(TAG,"ServerError");
        } else if (error instanceof NetworkError) {
            Log.e(TAG,"NetworkError");
        } else if (error instanceof ParseError) {
            Log.e(TAG,"ParseError");
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38566291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档