Ho cercato molto nel web per realizzare il download di un file da web senza il tradizionale AsyncTask e HttpRequest (che uso peraltro in altre apps) che però credo di aver capito deprecata e poco affidabile.
Ho cercato quindi di utilizzare la classe Volley che presenta parecchie novità in termini di facilitazione, sicurezza, organizzazione e opportunità.
Il mio intento nella fattispecie era ottenere da web un oggetto (JSON per la precisione) e ci sono riuscito (cioè, funziona
).
Lo voglio condividere e, data la mia breve esperienza in android, mi piacerebbe sapere dai più ferrati se è tutto corretto.
step 1: rendere disponibile la classe Volley
pare che le future linee guida di google prevedano di incorporare la classe nel proprio progetto (cosa facilmente ottenibile tramite il Git)
io però ho preferito un approccio classico aggiungendo la dipendenza:
codice:
compile 'com.mcxiaoke.volley:library-aar:1.0.0'
step 2: aggiungere al manifesto il consueto accesso a internet:
codice:
<uses-permission android:name="android.permission.INTERNET" />
adesso le classi:
step 3: CustomJSONObjectRequest.java che si occupa di fare la richiesta del file
codice:
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.RetryPolicy;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class CustomJSONObjectRequest extends JsonObjectRequest {
public CustomJSONObjectRequest(int method, String url, JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json; charset=utf-8");
return headers;
}
@Override
public RetryPolicy getRetryPolicy() {
return super.getRetryPolicy();
}
}
step 4: CustomVolleyRequestQueue.java che si occupa di incalanare la coda delle richieste
codice:
import android.content.Context;
import com.android.volley.Cache;
import com.android.volley.Network;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.BasicNetwork;
import com.android.volley.toolbox.DiskBasedCache;
import com.android.volley.toolbox.HurlStack;
public class CustomVolleyRequestQueue {
private static CustomVolleyRequestQueue mInstance;
private static Context mCtx;
private RequestQueue mRequestQueue;
private CustomVolleyRequestQueue(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
}
public static synchronized CustomVolleyRequestQueue getInstance(Context context) {
if (mInstance == null) {
mInstance = new CustomVolleyRequestQueue(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 * 1024 * 1024);
Network network = new BasicNetwork(new HurlStack());
mRequestQueue = new RequestQueue(cache, network);
mRequestQueue.start();
}
return mRequestQueue;
}
}
step 5: il codice che fa la richiesta nella Main Activity
codice:
mQueue = CustomVolleyRequestQueue.getInstance(this.getApplicationContext()).getRequestQueue();
String url = "urldelfiledascaricare";
final CustomJSONObjectRequest jsonRequest = new CustomJSONObjectRequest(Request.Method.GET, url, new JSONObject(), this, this);
mQueue.add (jsonRequest);
step 6: gestione della risposta
codice:
@Override
public void onResponse(Object response) {
try {
//fai quello che ti pare con l'oggetto 'response' ottenuto
} catch (JSONException e){
e.printStackTrace();
}
Successivamente, per la mia app, ho fatto il parsing dell'oggetto.
La classe Volley consente di scaricare di tutto: oggetti, array, immagini e gestisce le richieste autonomamente le quali possono essere anche cancellate ... insomma un sacco di roba
https://developer.android.com/traini...ley/index.html
Scusatemi se ho usato termini non esattamente tecnici e grazie a tutto il forum dal quale attingo ogni giorno