Abbiamo un'app per Android. L'app per Android utilizza Volley ( link ) per trasmettere dati di rete.
Il punto però non riguarda Volley, riguarda il modello utilizzato da Volley per eseguire una chiamata remota. Esempio:
final TextView mTextView = (TextView) findViewById(R.id.text);
...
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
Come ho detto, il punto non è su Volley ma sul modello. Creo una nuova richiesta, inserisco il callback e quando la chiamata termina, la funzione di callback aggiorna l'interfaccia utente.
Davvero semplice.
Ora, diciamo che l'utente continua a fare clic sul pulsante dannato, potrei generare un sacco di chiamate. Vorrei evitarlo.
Una soluzione, supponendo che non vi siano problemi di concorrenza poiché fare clic sui pulsanti è seriale, sarebbe quella di passare attorno a una variabile boolean
che verrà reimpostata su true al termine della richiamata.
Non mi piace questa soluzione perché ha accoppiato molto le cose.
Ovviamente questo codice è molto semplice, in produzione potresti avere una struttura di classe più complessa.
Quale pensi potrebbe essere una soluzione migliore?