Ringster's Techblog

Tech, Mobile, Internet

Volley를 이용해 Network Data 전송하기 (1) – Simple Request 전송

leave a comment »

안드로이드 App을 제작하다보면 이미지 파일 업로드/다운로드, Json 형식의 응답 주고 받기 등
네트워크를 통한 데이터 전송을 빈번하게 사용한다. 이를 위해 가장 많이 쓰이는 방법은 AsyncTask를 생성하여
DoitBackground 메소드 내에서 네트워크 작업을 처리하는 것인데, 이러한 작업들을 좀더 쉽고 빠르게 하기 위해
Google은 2013년 Google I/O에서 volley라는 Http 라이브러리를 공개했다.

Google Volley에 대한 자세한 설명은 Naver의 정상혁 님이 쓰신 글(여기)이나
Google I/O 발표자료 (110 – Volley- Easy,Fast Networking for Android)를 참조하기로 하고,
Google 개발자 튜토리얼(여기)을 참조하여 Volley를 이용해 네트워크 데이터를 처리하는 방법을 알아보도록 하자.


1. Volley Library Download 받기 및 프로젝트에 추가하여 사용준비 하기

먼저 다음 명령어를 실행하여 git repository에서 volley를 다운로드 받는다.

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

다음 명령어를 실행하여 build 환경을 재설정하고,

/Applications/adt-bundle-mac-x86_64-20140321/sdk/tools/android update project -p .

volley를 다운받은 폴더에서 lib파일을 생성한다.

/Applications/apache-ant-1.9.4/bin/ant jar;

그 이후 Project의 libs 폴더 안에 생성된 volley.jar파일을 붙여넣는다. (Eclipse 기준)

마지막으로 AndroidMenifest.xml 파일에 android.permission.INTERNET 퍼미션을 추가한다.

2. newRequestQueue 사용하기

Volley를 사용하는 방법은 크게 3단계로 나뉜다.
1) RequestQueue를 생성한다. 2) Request Object를 생성한다. 3) 생성한 Object를 RequestQueue로 넘긴다.
이번 포스팅에서는 RequestQueue를 생성하는 편의 메소드인 newRequestQueue를 이용하여
간단한 네트워크 데이터 전송을 수행하는 방법을 알아보도록 하자.

final TextView mTextView = (TextView) findViewById(R.id.text);
...

// Instantiate the RequestQueue. 
// 1) 편의 메소드를 이용하여 RequestQueue 생성 및 초기화
RequestQueue queue = Volley.newRequestQueue(this);
String url = "http://www.google.com";

// Request a string response from the provided URL. 
// 2) Request Obejct인 StringRequest 생성
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!");
    }
});
// 3) 생성한 StringRequest를 RequestQueue에 추가
queue.add(stringRequest);

Volley를 이용한 네트워크 응답은 언제나 main Thread로 전송되므로
response Handler를 통해 바로 Main UI에 접근할 수 있다.

add() 메소드를 수행하면 volley는 하나의 cache thread와 network dispatch thread pool을 실행시키고,
cache dispatcher를 통해 cache가 이용 가능한 Request는 cache 쓰레드로 보내고, 그렇지 않은 Request는
network thread로 보내 round robin 방식으로 처리한다.
처리된 결과는 쓰레드에 상관없이 모두 main Thread로 보내진다 (구조도 보기)

2. Request 취소하기

Request를 취소하기 위해서는 생성한 Request Object에 대하여 cancel() 메소드를 수행하면 된다.
volley는 cancel() 된 Object의 Response Handler가 수행되지 않음을 보장한다.
이는 Activity의 onStop() 메소드에서 모든 pending Request를 취소할 수 있고 onSaveInstanceState()가
호출되었든지 아니든지 간에 response Handler에서 getActivity()==null 체크나 기타 방어코드를 사용해가며
노력을 낭비할 필요가 없음을 의미한다.

이러한 장점을 얻기위해서는 모든 request를 적절한 시기에 취소하기 위해 추적해야 하는데,
이를 위한 간단한 방법이 있다.

바로 tag를 이용하여 모든 request를 tagging 하고 그 request의 적절한 취소 시기에 requestQueue.cancelAll(this)
메소드를 호출하는 것이다. 예를 들어서 다음과 같이 모든 request에 Tag를 추가하고,

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue;  // Assume this exists.

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
mRequestQueue.add(stringRequest);

Activity의 onStop 메소드에서 해당 Tag를 이용하여 모든 Request를 취소하는 것이다

@Override
protected void onStop () {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

이와 유사하게 ViewPager 는 page가 swipe될때 mRequestQueue.cancelAll(this)를 호출하여
기존 Request들을 취소하고 새로운 Request를 추가할 수 있다.

Advertisements

Written by Ringster

2014/12/03 , 시간: 8:51 오전

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

Jay Jin, Programmer&Designer

Fork my brain because I'm ready to commit

쉐어보드

쉐어메이트에 관한 모든 것

jamesjungkuelee's biotech story

Biotech, entrepreneur, life

Communications as Ikor

기업 위기관리의 모든 것

Charles Pyo Ventures

시도와 실패, 성장의 기록. 2막에서도 계속되는 모험들.

VentureBeat

News About Tech, Money and Innovation

Open API, Cloud, DevOps 와 eBook

Open API, eBook, Cloud, DevOps

Economics of almost everything

Tech, Mobile, Internet

cylee

Tech, Mobile, Internet

gorekun.log

고어쿤로그

Google Developers Korea 블로그

Tech, Mobile, Internet

Android Developers Blog

Tech, Mobile, Internet

최피디의 앱스 개발기

기술, 앱스, SNS, 창업

D2 Blog

Tech, Mobile, Internet

All of Software

Tech, Mobile, Internet

'Startup's Story Platform’

'Startup's Story Platform’

%d 블로거가 이것을 좋아합니다: