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请求。
发布于 2016-07-28 13:28:20
在loginRequest中设置字段,在onErrorResponse中像loginRequest.getUniqueId()一样访问该字段
或者,创建实现Response.Listener和ErrorListener的单独类
响应监听器类:
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类:
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);
}
}现在这样称呼它:
DataRequest loginRequest = new DataRequest(Method.POST, url, params, new MyResponeListener(uniqId), new MyErrorListener(uniqId));现在,如果您希望在ErrorListener类中可以访问调用类的一些代码,请执行以下操作: 1.在调用类中,将要访问的代码放在方法中2.使用这些方法创建一个接口3.调用类将实现该接口4.将该接口传递给MyErrorListener或MyResponseListener的构造函数
例如,一个活动调用volley请求,在出错时,您希望显示一条消息。将显示错误代码放在一个方法中:
public void showMessage(int errorCode){
//message according to code
}现在创建一个接口
public interface errorMessageInterface{
void showMessage(int errorCode);
}activity将实现errorMessageInterface并将其传递给MyErrorListener的构造函数,并将其保存在field中。
在onErrorResponse内部,您将调用
field.showMessage()发布于 2016-07-30 07:34:40
您可以使用与解析成功响应相同的方式来解析错误响应。我在我的项目中使用类似的解决方案。
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;
}
}使用:
...
, 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
}
}
}
...发布于 2016-07-28 13:08:06
只需在onError()方法中添加此代码,以确定您正在facing.Add这是哪种类型的错误:
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");
}https://stackoverflow.com/questions/38566291
复制相似问题