[android] Volley - Network & ImageLoading 라이브러리 ( google I/O 2013 )
android 2013. 5. 31. 14:32Google I/O 2013에서 volley 라는 새로운 라이브러리를 발표했습니다. 주요 역할은 Http통신 및 이미지 로딩을 해주는 것입니다.
주요 특징
* requestQueue를 이용한 동시요청 처리
* 요청 우선순위 설정 가능 ( A요청이 B요청보다 먼저 응답을 받아야 할 경우 )
* 요청 취소 기능 ( adapter 같은 곳에서 scrolling 이 빠른경우 응답이 않왔을때는 취소가 필요하죠. )
* android 하위 버전(2.3)에서 존재하던 HttpURLConnection의 버그 해결
* NetworkImageView 제공
Google I/O의 발표영상
초간단 사용법
// 초기화
mQueue = Volley.newRequestQueue(context);// thread pool(4)
mImageLoader = new ImageLoader(mQueue, new BitmapCache());
기본으로 4개의 thread pool을 사용하게 되어 있다.
// requestQueue 이용
final ImageView imageView = (ImageView) findViewById(R.id.image_view);
// clear
imageView.setImageBitmap(null);
// start load
Listener<Bitmap> listener = new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap result) {
imageView.setImageBitmap(result);
}
};
ErrorListener errorListener = new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// error handling
}
};
ImageRequest imageRequest = new ImageRequest(URL_IMAGE, listener, 0, 0, Config.ARGB_8888, errorListener);
imageRequest.setTag(TAG);
mQueue.add(imageRequest);
ImageRequest를 생성해서 큐(queue)에 넣어주면 되는데, ImageRequest에 url과 성공, 실패시 처리할 리스터(listener)를 넘겨준다.
// NetworkImageView 이용
NetworkImageView imageView = (NetworkImageView) findViewById(R.id.network_image_view);
// clear
imageView.setImageUrl(null, null);
// start load
imageView.setImageUrl(URL_IMAGE, mImageLoader);
NetworkImageView는 정말 간단하다. 그냥 url 과 imageLoader만 넘겨주면 된다.
// GET 호출 ( with parameter )
Listener<String> listener = new Listener<String>() {
@Override
public void onResponse(String result) {
// some action
}
};
String uri = String.format("http://somesite.com/some_endpoint.php?param1=%1$s¶m2=%2$s", num1, num2);
StringRequest myReq = new StringRequest(Method.GET,
uri,
listener,
errorListener);
mQueue.add(myReq);
GET 방식으로 이미지 호출이 아닌 api 를 호출해서 data를 받아 오는 경우도 흔하므로 위와 같이 StringRequest를 이용해서 사용하면 된다. Parameter는 Get 방식이므로 url로 전달하면 된다. ( Json 형식을 사용할땐, StringRequest 대신에 JsonRequest를 사용하면 된다. )
// POST 호출 ( with parameter )
StringRequest myReq = new StringRequest(Method.POST,
"http://somesite.com/some_endpoint.php",
listener,
errorListener) {
@Override
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("param1", num1);
params.put("param2", num2);
return params;
};
};
mQueue.add(myReq);
Post로 호출할 경우에는 StringRequest의 getParams() 함수를 overriding 해주면 된다. 리턴형식으로 Map<String, String>을 사용하므로 여러 개의 파라미터를 전달 할 수 있다.
<참고>
valley : https://android.googlesource.com/platform/frameworks/volley
샘플 : https://github.com/ogrebgr/android_volley_examples