Залп выполнил слишком много неконтролируемых попыток - PullRequest
0 голосов
/ 24 августа 2018

У меня серьезная проблема.

У меня есть небольшое приложение для ресторана, чтобы управлять созданием заказов, обновлением и так далее.Официанты используют планшет Android для обслуживания клиентов.

Дело в том, что примерно через неделю я понял, что билеты имеют тенденцию дублировать предметы.После некоторых исследований и изучения журналов, я понял, что много раз, когда я вызываю AsyncTask для запроса к серверу, он не отправляет ОДИН запрос, вместо этого он отправляет несколько запросов.По этой причине, если я вызову службу addItemToOrder четыре раза, она добавит четыре элемента вместо одного.

Вот мой код.Это «общая задача GET Async», которую я называю.У него есть URL, он может иметь или не иметь некоторые параметры, и он просто создает запрос залпа, который отправляется на сервер.Как вы можете видеть, он имеет 0 повторов, и, прежде чем вы сможете спросить, я просто убедился, что этот AT не вызывается более одного раза:

package es.vdevelop.tpvmobile.asynctask;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.widget.Toast;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bugfender.sdk.Bugfender;

import org.json.JSONException;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;

import es.vdevelop.tpvmobile.Constants;
import es.vdevelop.tpvmobile.ErrorHelper;
import es.vdevelop.tpvmobile.FunctionsHelper;


abstract class GenericGetAsyncTask extends AsyncTask<Void, Void, Void> {

    private static final String TAG = "DEBUG GenericGetAT";

    Handler h;
    WeakReference<Context> context;

    String auxURL;
    HashMap<String, String> postParams;
    String query;

    GenericGetAsyncTask(WeakReference<Context> context, Handler h) {
        this.auxURL = "";
        this.context = context;
        this.h = h;
        this.postParams = new HashMap<>();
        this.query = "";
    }


    @Override
    protected Void doInBackground(final Void... params) {
        if (!FunctionsHelper.isConnected(context.get())) {
            h.sendEmptyMessage(ErrorHelper.HANDLER_NO_INTERNET_ERROR);
            Bugfender.d(TAG, "No internet connection");
            ErrorHelper.mostrarError(context.get(), ErrorHelper.HANDLER_NO_INTERNET_ERROR, TAG);
            return null;
        }

        String urlParcial = Constants.getUrl(context.get());
        if (urlParcial.equals("")) {
            h.sendEmptyMessage(ErrorHelper.HANDLER_FALTA_URL);
            Bugfender.d(TAG, "Falta url");
            ErrorHelper.mostrarError(context.get(), ErrorHelper.HANDLER_URL_INCORRECTA, TAG);
            return null;
        }


        int metodo;
        String url;
        if (query == null || query.equals("")) {
            url = urlParcial + this.auxURL;
            metodo = Request.Method.POST;
        } else {
            url = urlParcial + this.auxURL + "?" + this.query;
            metodo = Request.Method.GET;
        }
        Bugfender.d(TAG, "url -> " + url);


        final RequestQueue queue = Volley.newRequestQueue(context.get());
        final StringRequest request = new StringRequest(metodo, url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                try {
                    onResultRetrieved(response);
                } catch (JSONException e) {
                    Bugfender.d(TAG, "Hubo un error de json en onResponse -> " + e.toString());
                    h.sendEmptyMessage(ErrorHelper.HANDLER_RESPUESTA_INCORRECTA);
                    ErrorHelper.mostrarError(context.get(), ErrorHelper.HANDLER_JSON, TAG);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Bugfender.d(TAG, "Error recibido del servidor -> " + error.toString());
                ErrorHelper.mostrarError(context.get(), ErrorHelper.HANDLER_RESPUESTA_INCORRECTA, TAG);
                Toast.makeText(context.get(), "Error realizando llamada http -> " + error.toString(), Toast.LENGTH_SHORT).show();
                h.sendEmptyMessage(ErrorHelper.HANDLER_ERROR);
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                return postParams;
            }

            @Override
            public Priority getPriority() {
                return Priority.IMMEDIATE;
            }
        };
        request.setRetryPolicy(new DefaultRetryPolicy(2000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        queue.add(request);
        return null;
    }


    protected abstract void onResultRetrieved(String result) throws JSONException;
}

После этого, тогда мне просто нужно наследовать отэтот общий AT с небольшим количеством кода для выполнения простого запроса, как вы можете видеть здесь в этом "UpdateTicketAT":

package es.vdevelop.tpvmobile.asynctask;

import android.content.Context;
import android.os.Handler;

import com.bugfender.sdk.Bugfender;

import org.json.JSONException;
import org.json.JSONObject;

import java.lang.ref.WeakReference;

import es.vdevelop.tpvmobile.Constants;
import es.vdevelop.tpvmobile.ErrorHelper;
import es.vdevelop.tpvmobile.Functions;


public class UpdateTicketAsyncTask extends GenericGetAsyncTask {

    private static final String TAG = "DEBUG UpdateTicketAT";

    public UpdateTicketAsyncTask(WeakReference<Context> context, Handler h, String json) {
        super(context, h);
        this.auxURL = "actualizar_ticket.php";
        this.postParams.put("ticket", json);
        Bugfender.d(TAG, "Ticket que vamos a enviar -> " + json);
    }


    @Override
    protected void onResultRetrieved(String response) throws JSONException {
        Bugfender.d(TAG, "Respuesta obtenida del servidor -> " + response);
        JSONObject result = new JSONObject(response);
        int codigo = result.getInt("codigo");
        if (codigo == 0) {
            h.sendEmptyMessage(Constants.handlerOk);
            Bugfender.d(TAG, "Ticket actualizado correctamente");
        } else {
            h.sendEmptyMessage(Constants.handlerError);
            ErrorHelper.mostrarError(context.get(), codigo, TAG);
        }
    }
}

Я не могу выяснить, что здесь происходит.Я делаю что-то неправильно?

Одна важная вещь заключается в том, что вызовы на сервер не могут быть сделаны все подряд.Я имею в виду, я делаю запрос, я получаю ответ, и, может быть, через минуту или две, запрос делается снова!

Я просто могу узнать об этом, просматривая журналы сервера ..

Я не знаю, что здесь происходит ..

В любом случае, спасибо заранее!

1 Ответ

0 голосов
/ 24 августа 2018

Я вижу два способа ответить на ваш вопрос или нет:

Во-первых: мне не нравятся ваши "0" в строке DefaultRetryPolicy, попробуйте добавить что-то вроде этого:

jsonObjectRequest.setRetryPolicy (новый DefaultRetryPolicy (TIMEOUT_SERVICE, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

, повторяет, что вы знаете, это второй параметрпроверьте, что это 1), а последним является DefaultRetryPolicy.DEFAULT_BACKOFF_MULT (снова я знаю, бла-бла, но проверьте, что это 1.0f) или поместите литерал.

jsonObjectRequest.setRetryPolicy (новый DefaultRetryPolicy (TIMEOUT_SERV1, 1.0f));

Секунда: Вы можете установить только больше времени для своего тайм-аута.

Надеюсь, это поможет вам.

...