Как справиться с плохим сигналом / интернет-соединением с помощью Volley?

#java #android #httprequest #android-volley

#java #Android #httprequest #android-volley

Вопрос:

Недавно я переключился со старой библиотеки apache на Volley, но я не могу заставить ее работать аналогичным образом.

Я пытаюсь отправлять запросы на конечную точку с помощью Volley, но я понял, что проблемы могут возникнуть, когда у телефона нет хорошего сигнала / подключения к Интернету. Я не хочу, чтобы сервер получал спам с запросами в очереди, но я также хочу, чтобы запрос был отправлен, как только это позволит подключение к Интернету.

Как справиться с потерей соединения в течение более длительного периода времени с помощью Volley, не перегружая сервер и сохраняя при этом возможность отправки запроса на сервер, как только соединение будет достаточно хорошим?

Я попытался использовать Network Link Conditioner для имитации плохого соединения (потеря пакетов 65%), определяя время, необходимое для прохождения запроса, и запросы apache, похоже, проходят намного быстрее, не рассылая спам на сервер с запросами.

Ниже приведен код, который я использую в настоящее время:

 while(requestNotConfirmedOnServer()) {
    numberOfTries  ;
    if(numberOfTries <= Constants.ADD_ALARM_RETRIES) {
        final CaStringRequest stringRequest = new CaStringRequest(_context, Request.Method.GET, false, addURL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        wsRequestIsInProgress = false;
                        //Handle response
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        wsRequestIsInProgress = false;
                        Log.d(TAG, "VolleyError: "   error);
                    }
                });

        stringRequest.setRetryPolicy(new DefaultRetryPolicy(60000, 0, 1f));
        if(requestNotConfirmedOnServer()) {
            CARequestQueue.getInstance(_context).addToRequestQueue(stringRequest);
            wsRequestIsInProgress = true;
        }

        try {
            while(wsRequestIsInProgress) {
                Thread.sleep(1000);
            }
            Thread.sleep(Constants.ADD_ALARM_RETRY_TIMEOUT);
        } catch (InterruptedException e) {
            ApplicationManager.getInstance(_context).printLog(TAG, "Error while putting thread to sleep: ");
        }
  }
}
 

Кроме того, старый код apache:

 while(requestNotConfirmedOnServer()){
    try{
    String addURL = "http..."
        ApplicationManager.getInstance(_context).printLog(TAG, addURL);
        CCResponse response= new WebServicesManager().sendHttpRequest(_context, addURL);

        if(response.get_httpCode()==HttpStatus.SC_OK){
            String[] responseParts = response._responseString.split(";");
      //Handle Response
        }
    }catch(Exception e){
        ApplicationManager.getInstance(_context).printLog(TAG, "Error: ");
    }
    ApplicationManager.getInstance(_context).printLog(TAG, "Putting thread to sleep.");
    try {
        Thread.sleep(Constants.ADD_ALARM_SLEEP_INTERVAL);
    } catch (InterruptedException e) {
        ApplicationManager.getInstance(_context).printLog(TAG, "Error while putting thread to sleep: ");
    }
}


//From WebServiceManager
public CCResponse sendHttpPostOrRequest(Context context, String relativeURL, String postData) {
  CCResponse ccResponse;
  try {
    String finalURL = "http://....";
    HttpParams httpParameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParameters, 30000);
    HttpConnectionParams.setSoTimeout(httpParameters, 30000);
    HttpClient httpclient = new DefaultHttpClient(httpParameters);
          HttpResponse response = null;
          if(postData != null){
              HttpPost httpPost = new HttpPost(finalURL);
              List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
              nameValuePairs.add(new BasicNameValuePair("data", postData));
              httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
              response = httpclient.execute(httpPost);
          }else {
              response = httpclient.execute(new HttpGet(finalURL));
          }
          HttpEntity resEntityGet = response.getEntity();
          String responseString = EntityUtils.toString(resEntityGet, "UTF-8");
          ccResponse = new CCResponse(response.getStatusLine().getStatusCode(), responseString);
    Log.d(TAG, responseString);
  }catch (Exception e) {
    Log.d(TAG, "Exception: "   e);
    ccResponse = new CCResponse(-1, "Exception "   e);
  }
  return  ccResponse;
}
 

Комментарии:

1. Когда вы это делаете, проверяли ли вы журналы сервера, чтобы узнать, как работает сервер?

2. Не ответ, но OkHttp может служить вам лучше, чем Volley. По умолчанию он выполняет автоматические попытки, и, по моему опыту, его проще использовать.