Android Volley множество заявки

Опитвам се да изпълня нова заявка за залпове в текущата заявка за залпове, но когато се извика новата заявка, тя не влиза в метода onrespond.

Новата заявка трябва да бъде изпълнена преди края на първата. (Последен влязъл, пръв излязъл)

Как мога да изпълня успешно новата заявка?

private void makeJsonObjectRequest() {
    ac = new AppController();


    final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d("test", response.toString());

            try {
                // Parsing json object response
                // response will be a json object


                JSONArray name = response.getJSONArray("data");
                for (int i = 0; i < name.length(); i++) {
                    JSONObject post = (JSONObject) name.getJSONObject(i);

                    try {
                        objectid = post.getString("object_id");

                        newRequest(objectid);

                    }
                    catch (Exception e) {

                   }

                }


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

            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("test", "Error: " + error.getMessage());
        }
    });

    // Adding request to request queue
    ac.getInstance().addToRequestQueue(jsonObjReq);
}

person eugngt    schedule 17.06.2015    source източник
comment
задайте Priority.HIGH на вътрешна заявка и Priority.LOW на външна заявка   -  person lazy lord    schedule 17.06.2015


Отговори (3)


Опитайте Работете 100%

public class Utility {
String result = "";

String tag_string_req = "string_raq";
private Activity activity;
Context context;
private LinearLayout mLinear;
private ProgressDialog pDialog;
public Utility(Context context) {
    this.context = context;
}

public String getString(String url, final VolleyCallback callback) {
    showpDialog();
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            result = response;
            hideDialog();
            callback.onSuccess(response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            callback.onRequestError(error);
            hideDialog();
           /*LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            View layout = inflater.inflate(R.layout.custom_toast, null);
            ((Activity) context).setContentView(layout);*/

        }
    });
    VolleySingleton.getInstance().addToRequestQueue(stringRequest, tag_string_req);
    stringRequest.setRetryPolicy(
            new DefaultRetryPolicy(1 * 1000, 1, 1.0f));
    return result;
}

public interface VolleyCallback {
    void onSuccess(String result);
    void onRequestError(VolleyError errorMessage);
    //void onJsonInvoke(String url, final VolleyCallback callback);
}

public boolean isOnline() {
    Runtime runtime = Runtime.getRuntime();
    try {
        Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
        int exitValue = ipProcess.waitFor();
        return (exitValue == 0);

    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return false;
}

private void showpDialog() {
    onProgress();
    if (!pDialog.isShowing())
        pDialog.show();
}

private void hideDialog() {
    if (pDialog.isShowing())
        pDialog.dismiss();
}

public void onProgress() {
    pDialog = new ProgressDialog(context);
    pDialog.setMessage("Please wait...");
    pDialog.setCancelable(false);
    pDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
}

}

Фрагмент на повикване

Utility utility = new Utility(getContext());
    utility.getString(urls, new Utility.VolleyCallback() {
        @Override
        public void onSuccess(String result) {
            try {
                JSONObject toplinks = new JSONObject(result);
                JSONObject data  = toplinks.getJSONObject("toplinks");
                M.i("============LS", "" + data);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            finally {

            }
        }
        @Override
        public void onRequestError(VolleyError errorMessage) {
            errorJson.setVisibility(View.VISIBLE);
            String msg = VolleyException.getErrorMessageFromVolleyError(errorMessage);
            errorJson.setText(msg);
        }
    });
person Rahul Vishwakarma    schedule 27.01.2016
comment
Това изглежда добре с една заявка. В моя случай имам 5 заявки за изпълнение, но първата трябва да бъде изпълнена преди следващите 4 заявки. Следващите 4 заявки могат да вървят паралелно. Някакви предложения, как мога да постигна това? - person user846316; 26.07.2016

всичко това за

Искане за приоритизиране

Мрежовите обаждания са операция в реално време, така че нека помислим, че имаме множество заявки, както във вашия случай, Volley обработва заявките от по-високи приоритети към по-ниски приоритети, в реда първи влязъл, първи излязъл.

Така че всичко, от което се нуждаете, трябва да промените приоритета (задайте Priority.HIGH), за да заявите, че искате процесът първо.

ето част от кода

public class CustomPriorityRequest extends JsonObjectRequest {

// default value
    Priority mPriority = Priority.HIGH;

    public CustomPriorityRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, jsonRequest, listener, errorListener);
    }

    public CustomPriorityRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
        super(url, jsonRequest, listener, errorListener);
    }

    @Override
    public Priority getPriority() {
        return mPriority;
    }

    public void setPriority(Priority p){
        mPriority = p;
    }
}
person Mina Fawzy    schedule 09.12.2015

Както други споменаха, един от начините е да поставите висок приоритет на заявката.

Друга опция, тъй като изглежда, че имате първата заявка в зависимост от вътрешната, увита в блока try-catch, което според мен искате да постигнете синхронно/блокиращо поведение за този конкретен случай. тогава можете да използвате RequestFuture :

RequestFuture<String> future = RequestFuture.newFuture();
StringRequest request = newRequest(objectid, future);
requestQueue.add(request);
String result = future.get();
person kalin    schedule 29.03.2016