在Android排球中处理多个请求

时间:2017-07-20 11:03:35

标签: android performance android-volley

我正在尝试使用Volley发出多个请求,我正在收到所有请求的响应。我的问题是如何识别响应属于哪个API。

mQueue = CustomVolleyRequest.getInstance(this.getApplicationContext())
            .getRequestQueue();

    final CustomJSONObjectrequest jsonRequest = new CustomJSONObjectrequest(Request.Method
            .GET, url,
            new JSONObject(), this, this); // 
    jsonRequest.setTag(REQUEST_TAG);

    final CustomJSONObjectrequest jsonRequest2 = new CustomJSONObjectrequest(Request.Method
            .GET, url2,
            new JSONObject(), this, this);
    jsonRequest2.setTag(REQUEST_TAG);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mQueue.add(jsonRequest);
            mQueue.add(jsonRequest2); // Both the request will have different API request
        }
    });
}
@Override
public void onErrorResponse(VolleyError error) {
    mTextView.setText(error.getMessage());
}

@Override
public void onResponse(Object response) {

    // How to identify, which response is belong to which api request
    mTextView.setText("Response is: " + response);

}

2 个答案:

答案 0 :(得分:3)

创建Generic Volley类和Interface,使用该接口获得成功和失败响应。

  • 步骤1创建单独的Volley类
  • 步骤2创建用于访问凌空类
  • 的响应的界面
  • 第3步创建新对象 该类和发送所需的参数
  

new PostVolleyJsonRequest(TestVolley.this,TestVolley.this(interfcae),“Submit”,url,params);

  1. 班级的背景
  2. 发送成功和失败的接口响应
  3. 成功识别请求的类型
  4. url(强制性)
  5. Param(可选)用于GET,不需要
  6. 通用排球班

    public class PostVolleyJsonRequest {
    private String  type;
    private Activity act;
    private VolleyJsonRespondsListener volleyJsonRespondsListener;
    private String networkurl;
    private JSONObject jsonObject = null;
    private JSONObject params;
    
    
    public PostVolleyJsonRequest(Activity act, VolleyJsonRespondsListener volleyJsonRespondsListener, String type, String netnetworkUrl,JSONObject params) {
        this.act = act;
        this.volleyJsonRespondsListener = volleyJsonRespondsListener;
        this.type = type;
        this.networkurl = netnetworkUrl;
        this.params = params;
        sendRequest();
    }
    
    private void sendRequest() {
    
        Log.d("url", "url" + networkurl);
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,networkurl,params,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.e("response", "response " + response);
                        volleyJsonRespondsListener.onSuccessJson(response, type);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        try {
                            NetworkResponse response = error.networkResponse;
                            Log.e("response", "response " + response);
                            if (response != null) {
                                int code = response.statusCode;
    
                                String errorMsg = new String(response.data);
                                Log.e("response", "response" + errorMsg);
                                try {
                                    jsonObject = new JSONObject(errorMsg);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                                String msg = jsonObject.optString("message");
                                volleyJsonRespondsListener.onFailureJson(code, msg);
                            } else {
                                String errorMsg = error.getMessage();
                                volleyJsonRespondsListener.onFailureJson(0, errorMsg);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    
        jsObjRequest.setRetryPolicy(new DefaultRetryPolicy(
                600000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    
        RequestQueue requestqueue = Volley.newRequestQueue(act);
        requestqueue.add(jsObjRequest);
    
    }
    

    }

    使用界面获取回复消息

    public interface VolleyJsonRespondsListener {
    
    public void onSuccessJson(JSONObject result, String type);
    public void onFailureJson(int responseCode, String responseMessage);
    

    }

    在您要包含多个请求的班级

    public class TestVolley extends AppCompatActivity implements VolleyJsonRespondsListener{
    
    //Your class code goes here
    
    
    //network request
    
    try {
            //parameters 
            //Context,Interface,Type(to indentify your responds),URL,parameter for your request 
    
            //request 1
            new PostVolleyJsonRequest(TestVolley.this, TestVolley.this, "Submit", url, params);
    
            //request 2
            new PostVolleyJsonRequest(TestVolley.this, TestVolley.this, "AccessData", url_2, params_2);
    
    
    
    
     } catch (Exception e) {
    
     e.printStackTrace()
     }
    
     //Methods from Interface
    
      @Override
    public void onSuccessJson(JSONObject result, String type) {
    
       //Based on the Type you send get the responds and parse it 
        switch (type) {
            case "Submit":
                try {
                    parseSubmit(result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
    
            case "AccessData":
                try {
                    parseAccessData(result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
               break;
        }
    

答案 1 :(得分:2)

您可以针对单个请求执行类似的操作。同样可以应用于第二个请求。这样您就知道哪个请求会给您回复。

final CustomJSONObjectrequest jsonRequest = new CustomJSONObjectrequest(Request.Method
        .GET, url,
        new JSONObject(), this,  new Response.Listener<Object>() {
                @Override
            public void onResponse(Object response) {

// How to identify, which response is belong to which api request
mTextView.setText("Response is: " + response);

});

已编辑:

您可以从制作如下界面开始:

public interface VolleyResponse {

void onResponse(JSONObject object, String tag);

void onError(VolleyError error, String tag);
}

然后你可以为排球请求制作一个自定义处理程序,如:

public class CustomJSONObjectRequest implements Response.Listener<JSONObject>, Response.ErrorListener {

private VolleyResponse volleyResponse;
private String tag;
private JsonObjectRequest jsonObjectRequest;


public CustomJSONObjectRequest(int method, String url, JSONObject jsonObject, String tag, VolleyResponse volleyResponse) {
    this.volleyResponse = volleyResponse;
    this.tag= tag;
    jsonObjectRequest = new JsonObjectRequest(method, url, jsonObject, this, this);
}

@Override
public void onResponse(JSONObject response) {
    volleyResponse.onResponse(response, tag);
}

@Override
public void onErrorResponse(VolleyError error) {
    volleyResponse.onError(error, tag);
}

public JsonObjectRequest getJsonObjectRequest() {
    return jsonObjectRequest;
}
}

要在课堂上调用它,请使用它:

 CustomJSONObjectRequest request1 = new CustomJSONObjectRequest(Request.Method.GET, url,
            new JSONObject(), "YOUR REQUEST TAG", this);

请务必让您的班级实施VolleyResponse界面,以获取回复和您的标记。

@Override
public void onResponse(JSONObject object, String tag) {
    Log.i("Response :", object.toString() + "   " + tag);
}

@Override
public void onError(VolleyError error, String tag) {

}

要将请求添加到排球队列,您可以使用:

mQueue.add(request1.getJsonObjectRequest());

PS:此代码未经过测试但应该可以使用。