2015-12-21 1 views
1

Je fais plusieurs demandes à Amazon Web Services. Je reçois l'erreur 503 parce que je fais trop de demandes trop rapidement. Je veux savoir comment définir le délai d'attente entre différentes demandes, pas les mêmes. Je suis pas cherchant à définir la politique de nouvelle tentative. Je suis également pas cherchant à déclencher le temps demandes individuelles. Je veux chronométrer l'intervalle entre les demandes. La raison en est que je suis en train de boucler si vite et de faire tellement de requêtes, que les déclencher dans le temps équivaut à les soumettre toutes en même temps. Le point entier est de espace les demandes uniformément.Comment modifier le taux de demande Volley

+0

J'ai essayé ceci. Je vais essayer à nouveau, mais il s'agit d'une politique de "réessayer", ce qui signifie que c'est le délai entre les demandes de "réessayer", pas les demandes séparées. –

+0

Je ne cherche pas à calculer le temps de réponse. –

Répondre

1

Puisque vous ne montrez pas comment vous avez fait plusieurs demandes, alors je vous suggère de vous référer à l'exemple suivant, puis essayez d'appliquer à votre code. J'espère que cela aide!

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);    

     final RequestQueue queue = Volley.newRequestQueue(this); 
     final String url = "http://google.com"; 
     final Handler handler = new Handler(); 
     for (int i = 0; i <= 5; i++) { 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        StringRequest request = new StringRequest(url, new Response.Listener<String>() { 
         @Override 
         public void onResponse(String response) { 
          Log.i("onResponse", response);         
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          Log.e("onErrorResponse", error.toString()); 
         } 
        });  
        queue.add(request); 
       } 
      }, 2000); // 2000 miliseconds 
     } 
    } 
+0

Merci BNK. Mais votre méthode n'a pas fonctionné, en supposant que je l'ai utilisé correctement. J'ai posté mon code dans un edit. J'ai essayé d'utiliser la méthode du sommeil, mais cela fait dormir toute l'application, même si cela fonctionne. –

+0

Si vous voulez envoyer la même demande (je veux dire 'demande StringRequest') plusieurs fois, mon code fonctionne, je l'ai vérifié avant de poster ici :) – BNK

+0

Je pense que je vois ce que mon problème est. Je fais des boucles et je fais des demandes très rapidement. Au moment où une requête chronométrée est déclenchée, il en est de même pour la suivante, et la suivante, etc. Je peux chronométrer une requête du point où elle est soumise à la file d'attente, mais je ne peux pas définir l'heure entre les requêtes. –

1

en supposant que vous avez l'objet de demande, avant d'ajouter la demande à la file d'attente, vous pouvez le faire

request.setRetryPolicy(new DefaultRetryPolicy(5000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

5000 indique le temps écoulé entre chaque demande en ms le 5 est le nombre de fois que vous voulez envoyer la demande avant qu'elle ne vous donne TimeOut

pour le bien de quelqu'un voyant cela, voici comment utiliser des minuteries pour une tâche manuellement reléguer

Timer timer = new Timer(); 
    final Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      // Update UI here if u need 
     } 
    }; 
    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      //send requests according to your logic here 
     } 
    }; 
    timer.schedule(task, 0, 60000); // 60000 = 1 min 
+0

J'ai essayé ceci. Je vais essayer à nouveau, mais il s'agit d'une politique de "réessayer", ce qui signifie que c'est le délai entre les demandes de "réessayer", pas les demandes séparées. –

+0

alors laissez-moi bien comprendre, vous envoyez des demandes DIFFERENTES mais vous voulez les chronométrer pour qu'elles ne soient pas envoyées l'une après l'autre directement? Si c'est le cas, vous devriez l'avoir dit, mais je suppose que vous devez gérer cela manuellement à partir de votre code, vous décidez en fonction de vos critères quand envoyer ou non –

+0

C'est ce que j'ai dit. Oui, je vais décider de mes propres critères si c'est possible. –

0

Était aussi en difficulté avec ceci, jusqu'à ce que j'ai reçu de l'aide d'un autre développeur. Essayez quelque chose comme ceci:

public class HTTP { 
    String getUrl; 
    Context context; 
    YTVisualizer ytv; 
    int numberOfCurrentRequests = 0; 

    public HTTP(Context context, YTVisualizer ytv){ 
     this.context = context; 
     this.ytv = ytv; 
    } 

    public void get(final String url) { 
     numberOfCurrentRequests++; 

     new Thread(new Runnable() { 
      public void run() { 
       try { 
        Thread.sleep(250 * numberOfCurrentRequests); 
       } catch(InterruptedException e) { 
        e.printStackTrace(); 
       } 

       // Instantiate the RequestQueue. 
       RequestQueue queue = Volley.newRequestQueue(context); 

       String[] parts = url.split("="); 
       final String key = parts[1]; 

       // Request a string response from the provided URL. 
       StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
         new Response.Listener<String>() { 
          @Override 
          //runs in thread main 
          public void onResponse(String response) { 
           Log.i("Response", response); 

           String title = new String(); 

           try { 
            JSONObject obj = new JSONObject(response); 
            Iterator<String> str = obj.keys(); 
            String key = str.next(); 
            title = obj.getString(key); 

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

           ytv.SetVideosFromHTTPClass(key, title, response); 

           numberOfCurrentRequests--; 
          } 
         }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(context, "Error: are you connected to the internet?", Toast.LENGTH_SHORT).show(); 
         numberOfCurrentRequests--; 
        } 
       }); 

       // Add the request to the RequestQueue. 
       queue.add(stringRequest); 
      } 
     }).start(); 
    } 
} 

Il fait une pause entre proportionnelle à la quantité de demandes en cours. Le 1er dort .25 s, le 2ème un .5s, le troisième .75s, et ainsi de suite. Ils sont tous programmés dans l'ordre.