Android Programjaim

Android, Flutter/Dart, Kotlin, Java, Unity, HarmonyOS

Volley vs AsyncTask

2016. április 01. 09:19 - lacas8282

Ok, ebben a postban a Volley-rol lesz szo. Ugye kezdetben mindenki Thread-eket hasznal, vagy AsyncTask-et, esetleg egy UrlConnection-t, hogy letoltsunk valami tartalmat a nettol.

Ezzel az a gond, hogy lassú és a kódolása is körülményes.

Szerencsére itt van nekunk a Volley, ami egy Google talalmany, jobb esetben mar ezt hasznalod, meg jobban pedig a retrofit library-t. A Volley egy HTTP library, mig a retrofit is hasonlo, de inkabb json-ra van alapbol fokuszalva. Mindenesetre meg lehet oldani, hogy sima stringet huzzon le ott is.

A Retrofitrol a kovetkezo post-ban beszelek, most ugyanis van idom blogolgatni, nincs nagyon munka.

Tehat a Volley elonyei:

Nem kell felesleges kodokat begepelnunk, es van hozza mar egy callback is, ezt sem kell megirnunk. (callback = interface)

Persze elso korben,, ha csak tanulasi celzattal tesszuk erdemes lehet AsyncTask/Callback/Http(s)UrlConnection combokat hasznalni, hogy azert lassuk mi megy vegbe.

Lassunk egy Volley kodot, teszem azt egy sima GET-re:

 

public void sendGet(String url, final String referer, final String cookie,
final HttpValueGetCallback<String> callback) {

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

StringRequest request = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
if (callback!=null) callback.gotValueBack( responseHeaders.toString() +response);
}
},
new Response.ErrorListener()
{
@Override
public void onErrorResponse(VolleyError error) {
Logger.D("ERROR","error => "+error.toString());
if (callback!=null) callback.gotValueBack("ERR");
}
}
)
{

@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
responseHeaders = response.headers;
return super.parseNetworkResponse(response);
}

@Override
public Map<String, String> getHeaders() {
Map<String, String> params = new HashMap<>();
if (referer!=null) params.put("Referer", referer);
if (cookie!=null) params.put("Cookie", cookie);

return params;
}
};

request.setRetryPolicy(
new DefaultRetryPolicy(
DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

queue.add(request);

}

En letrehoztam egy callback-et is, hogy egy sajat osztalybol siman
kapjak visszateresi erteket. A callback egyszeru:
public interface HttpValueGetCallback<T> {
void gotValueBack(T result);
}


A queue-nk pedig:

queue = Volley.newRequestQueue(ChathuStartActivity.mContext);


Mint lathato ugyanugy be tudjuk allitgatni a header-eket, cookie-kat, referrert, akarmit amit csak akarunk. 

Bovebb leiras, angolul itt talalhatunk az asynctasks vs volley vs retrofit-rol

http://instructure.github.io/blog/2013/12/09/volley-vs-retrofit/

En egyelore a chat6-ba refaktoraltam a kodot, hogy sima Async-ok es UrlConnection-ok helyett, ezzel kerem le, de a valtozas maris megtortent. Kb 1.5-2-szer gyorsabb egy-egy lekeres, mint az eredeti megoldas es kicsit szebb megoldas is, mint ganyolgatni.

Volleyban van

StringRequest

ImageRequest

JsonObjectRequest

JsonArrayRequest

JsonRequest

Bővebben: http://developer.android.com/training/volley/request.html

Amit elfelejtettem: ugye mindenki Android Studioban kodol mar, aki ertelmesebb, tehat a dependencies-be ezt rakd hozza:

compile 'com.android.volley:volley:1.0.0'


Emlekezz: mindig hasznalj kesz megoldasokat, ne ird meg azt, amik mar meg vannak irva.

Azt hiszem nem esett szo meg a blogon a Picasso vs Glide koönyvtarakrol sem, majd ennek is szentelek a kozeljovoben egy post-ot.

komment
Címkék: asynctask volley
süti beállítások módosítása