Android Volley와 사용법 예제


안드로이드 발리 (Android Volley)는 구글 I/O 2013에서 첫 등장한 이후로 지속적으로 업데이트 되고 있는


네트워크 라이브러리이며, 구글이 지난 몇년 간 안드로이드를 개발하며 자신들이 겪은 문제점과 그에 따른 노하우를 집대성한


라이브러리입니다. 요 근래에 새로이 알아볼 필요가 있어보여 간단히 알아봤습니다.


먼저 간단히 특징과 기능을 알아보면 아래와 같습니다.



Volley의 특징 및 기능



- 현재의 Google PlayStore 앱에도 사용된 라이브러리


- Queue + Thread Pool을 이용한 동시 요청 지원


- 요청별 우선 순위 지원 (String과 Image를 동시에 다운로드 시 String쪽이 Queue에서 우선순위를 받는다는 뜻 같기도...)


- 요청자쪽에서 cache 적용여부를 의식하지 않아도 됨


- Android 2.3 Gingerbread 이하 버전의 httpClient Library 에러 수정


- JSON / XML / Image 등 다양한 Response 형식 처리 가능



Volley는 별도의 release 프로세스가 존재하지 않기 때문에 git을 이용해 받을 수 있습니다.



git 다운로드 방법


git clone https://android.googlesource.com/platform/frameworks/volley



이후 ant를 이용하여 build 후 나오는 jar 파일을 이용하면 되는데..


막상 해보니 2015년 6월 2일 당시 제대로 빌드되지 않는 문제가 발생하여 검색해보니


빌드된 라이브러리를 그대로 제공해주는 사이트가 있어 소개해드립니다.





위에서 빌드 된 volley 라이브러리의 jar를 바로 다운받아 적용 가능합니다.



Data Request with Android Volley


Volley로 네트워크 요청, 수신 하는 방법은 크게 3가지 방법으로 나뉘는데


1.RequestQueue 생성

2. Request Object 생성

3. 생성된 Object를 RequestQueue로 전달

4. 이후 할당된 Response로 Callback

	

입니다.


RequestQueue는 싱글톤 방식으로 하나만 생성하여 지속적으로 Queue에 데이터를 전달하는 방식을 쓰는 것이 좋겠죠.



간단한 샘플 코드는 아래를 참조하면 되겠습니다.


Volley (String / Image) 다운로드 사용 샘플 코드


public class MainActivity extends Activity 

{

TextView tv_1;

ImageView iv_1;

NetworkImageView niv_1;


@Override

protected void onCreate(Bundle savedInstanceState) 

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


tv_1 = (TextView) findViewById(R.id.tv);

iv_1 = (ImageView) findViewById(R.id.iv);

niv_1 = (NetworkImageView) findViewById(R.id.niv);


// StringRequest

// String url1 = "http://www.w3schools.com/xml/simple.xml";

// String url1 = "http://google.com";


final StringRequest stringRequest1 = new StringRequest(Request.Method.GET, url1,

new Response.Listener<String>() {

@Override

public void onResponse(String response) 

{

tv_1.setText("Response !!!!!");

Log.v("1", response);

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) 

{

if (error instanceof TimeoutError) 

{

tv_1.setText("TimeOutError");

}

// 네트워크 연결이 모두 끊어진 경우

else if (error instanceof NoConnectionError)

{

tv_1.setText("NoConnectionError");

}

else if (error instanceof AuthFailureError) 

{

tv_1.setText("AuthFailureError");

}

// 서버에러, URL에 해당 자료가 없어도 이곳이 불린다.

else if (error instanceof ServerError) 

{

tv_1.setText("ServerError");

else if (error instanceof NetworkError) 

{

tv_1.setText("NetworkError");

else if (error instanceof ParseError) 

{

tv_1.setText("ParseError");

}

}

});

// 요청에 대한 태그 지정, 취소할 때 태그를 이용하면 된다.

stringRequest1.setTag("testTAG");



// 3) 생성한 StringRequest를 RequestQueue에 추가, 순차적으로 진행된다.

//SingleTon.getInstance(this).addToRequestQueue(stringRequest1); 


// 취소를 원하는 경우 태그를 이용해 취소하는 것이 좋다.

//queue.cancelAll("testTAG");












// ImageRequest

String imgurl = "http://www.google.co.kr/logos/doodles/2014/anna-freuds-119th-birthday-5664856720015360-hp.jpg";


// deprecated

// // Retrieves an image specified by the URL, displays it in the UI.

// ImageRequest imageRequest = new ImageRequest(imgurl,

// new Response.Listener<Bitmap>() {

// @Override

// public void onResponse(Bitmap bitmap) {

// iv_1.setImageBitmap(bitmap);

// }

// }, 0, 0, null,

// new Response.ErrorListener() {

// public void onErrorResponse(VolleyError error) {

// iv_1.setImageResource(R.drawable.ic_launcher);

// }

// });


final ImageRequest imageRequest = new ImageRequest(imgurl, 

new Response.Listener<Bitmap>() 

{


@Override

public void onResponse(Bitmap bitmap) 

{

// TODO Auto-generated method stub

iv_1.setImageBitmap(bitmap);

}

}, 

100, 100, ScaleType.FIT_CENTER, null, 


new ErrorListener() 

{

@Override

public void onErrorResponse(VolleyError arg0) 

{

// TODO Auto-generated method stub

iv_1.setImageResource(R.drawable.ic_launcher);

}

});



// 큐에서 다운로드 시작

SingleTon.getInstance(this).addToRequestQueue(stringRequest1);

SingleTon.getInstance(this).addToRequestQueue(imageRequest);

// ImageLoader and NetworkImageView

String IMAGE_URL2 = "http://developer.android.com/images/training/system-ui.png";

// 직접 이미지 뷰에 사용

ImageLoader imageLoader = SingleTon.getInstance(getApplicationContext()).getImageLoader();

//imageLoader.get(IMAGE_URL2, ImageLoader.getImageListener(iv_1,R.drawable.ic_launcher, R.drawable.ic_launcher));

// 네트워크 이미지 뷰에 사용

niv_1.setImageUrl(IMAGE_URL2, imageLoader);

}


@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();


// 왠지 몰라도 종료 시 이렇게 해줘야 수동 캐시 삭제에도 제대로 대응할 수 있다.

System.exit(0);

}

}

	

더불어 위의 코드는 단일 이미지를 다운로드 하기 위함이고,


ListView등에서 지속적인 관리를 위하려면 Volley에 포함된 ImageLoader와 NetworkImageView를 쓰면 된다고 합니다.


아직 이 부분은 조금 더 테스트 중..^^;




testVolley.zip


이 글을 공유하기


댓글(4)

Designed by CMSFactory.NET