'Volley'에 해당하는 글 2건

Google Volley Library


Google I/O 2013에서 처음 발표 된 Volley Library는 굉장히 강한 자부심을 가지고 Google에서 소개한 Http 라이브러리입니다. 효율적인 병행 처처, 재시도, 백오프 정책, 캐시, 이미지 로더, 우선순위 설정 및 요청 취소등의 다양한 기능등을 제공하면서 강력한 HTTP Library라는 점을 강조하였습니다. 쉽게 이야기 하면 Side Effect도 없고, Code Line도 Simple하게 구현이 가능하게 제공을 한다는 것입니다.


[Volley란 무엇인가?]

Volley는 테니스나 발리볼의 발리를 연상하게 하고, 클라이언트가 넷 넘어로 서버에 요청을 쏘면 그것이 돌아온다는 은유가 되기도 합니다.( a client sends a request a server over the net. It comes back.) 그러나 제가 이름을 지을 때는 '일제 사격'( A burst or emission of many things or a large amount at once.) 의 광경을 생각했습니다.


Volley의 기능을 정리해 보면 아래와 같습니다.

- 요청작업큐 + Thread pool을 이용한 동시 요청 지원.

- 요청별 우선 순위 

  목록조회와 이미지 다운로드를 할때 목록조회가 우선순위가 높게 설정. 다음 페이지의 목록조회를 요청하면 이전페이지의 이미지로딩이 끝나지 않아도 기다리지 않고 수행.

- Transparent cache

  요청하는 쪽에서 Cache 적용여부를 의식하지 않아도 됨. 이미지 로딩툴, NetworkImageVIew라는 View 제공.

- 요청 취소 

  특정 요청, 해당 Context의 요청 모두 취소할 수 있고, 취소할 규칙도 지정 가능

- 진저브레드 이전의 HttpURLConnection의 버그 문제 해결

  2013년 5월 The platform에 기고한 Android의 HTTP 클라이언트 라이브러리 기사에서 다룬 여러 오픈소스가 그랬던 것처럼 진저브레드 이상에서만 java.net.HttpURLConnection을 쓰는 로직이 들어가 있습니다.

- retry, backoff policy 지원, 확장 기능

- SPDY 지원

  발표 당시에는 Volley의 tranport stack으로 OkHttp( http://square.github.io/okhttp/ ) 를 넣는 작업이 누군가가 진행하고 있다고 했는데, 기사를 작성한 이후에 따끈따끈하게 공개 되었습니다.

- JSON, XML, Image, protobuffer 등 다양한 Response형식을 처리하도록 확장 가능


자신감을 나타내는 또 다른 요소는 바로 Benchmark 결과입니다. 당시 현존하는 다양한 Library들과 비교했을 당시 100% 빠른 결과를 냈고, 심지어 10배까지 빠른 경우가 있었기 때문입니다. 추가로, Google이 개발 시 경험했던 문제점들에 대한 해결책이 녹아 들어있기 때문에, 개발자들이 더 이상 고민을 할 필요없이 간편하게 사용만 하면 되기 때문입니다. 어찌보면, 개발자를 꿈꾸고 공부하는 사람들에게는 독이든 성배일지도 모르겠습니다. 


라이브러리 소스도 공개하였습니다.

아래와 같이 libary를 생성하셔서 사용하시면 됩니다.

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

    cd volley

    ant jar

또는, 아래 경로에서 다운받아 사용하셔도 됩니다.

    http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.mcxiaoke.volley%22

혹은 아래 경로에서 소스를 다운받아 직접 빌드를 하셔도 됩니다.

    https://github.com/mcxiaoke/android-volley


장점도 많고 사용성이 뛰어나다고 해서 단점이 없는 것은 아닙니다.

- 릴리스 프로세스와 패키지 관리 부재

- 다양한 구현체 부재

- 페이로드가 큰 요청에 대한 교려 부재

- Request Class 상속에 관련 문제

- Cache에 대한 구현체 부재


때문에, 많은 사람들이 단점을 보완하여 새로운 라이브러리를 제시하고 있습니다.

1. com.android.volley.toolbox.ImageLoader.ImageCache 구현

  - Ficusk의 LruBitmapCache : android.support.v4.util.LruCache를 상속해서 구현. Google I/O 2013 발표에서 공유.

    https://gist.github.com/ficusk/5614325

  - howrobotswork의 DiskBitmapCache : Volley의 DiskBasedCache를 상속해서 구현

    http://howrobotswork.wordpress.com/2013/06/02/downloading-a-bitmap-asynchronously-with-volley-example/

  - 전형일님의 WeakImageCache : java.lang.WeakReference를 활용.

    https://gist.github.com/givenjazz/5626084

    

Google IO 2013에서 Volley 세션의 발표자인 Ficus Kirkpatrick는 Google쪽에서는 soft reference나 weak reference를 쓰지 않는다고 언급을 하기는 합니다.( And so we don't use soft references or weak references. They don't work well. We use hard references and set a strong budget. we are conservative in setting that budget by scaling down with the screen and really the number of pixels ) 그래도 단순한 구현이라는 점에서 WeakImageCache 참고할만합니다.


2. com.android.volley.Request 상속

  - Ficusk의 GsonRequest : Google Gson 라이브러리로 json을 파싱하는 구현. Google I/O 2013 발표에서 공유.

    https://gist.github.com/ficusk/5474673

  - njzk2의 DelegatingRequest : Request에 addHeader()메소드로 헤더 설정 가능. HTTP 인증 때문에 만든 클래스.

    http://njzk2.wordpress.com/2013/06/17/an-extension-to-volley/


3. com.android.volley.toolbox.HttpStack 구현

  - Jake Wharton의 OkHttpStack : HttpURLConnection이나 Apache HttpClient대신 OkHttp를 사용할 수 있는 구현

    https://gist.github.com/JakeWharton/5616899

  

4. com.android.volley.toolbox.NetworkImageView 상속

  - benvd의 FadeInNetworkImageView : 이미지 보일 때 페이드인 애니메이션을 추가

    https://gist.github.com/benvd/5683818

  

5. com.android.volley.toolbox.ImageLoader 상속

  - njzkw의 ExtendedImageLoader : 기존 ImageLoader가 내부적으로 ImageRequest를 사용하는데, 이 클래스는 Request 구현체도 사용 가능.

    http://njzk2.wordpress.com/2013/06/17/an-extension-to-volley/

    

6. Naver Volley Extensions

   개인적인 생각으로 가장 단점을 보완하여 완전한 라이브러리를 만들려는 노력이 돋보이는 라이브러리라고 생각이 된다. 하지만 아쉬운 점은 더 이상 관리가 안되는 것으로 보인다.

   http://d2.naver.com/helloworld/1258547

   https://github.com/naver/volley-extensions

   

[Application 예제 및 설명]

Google Volley 기본 : http://victor8481.tistory.com/

http://www.kpbird.com/2013/05/volley-easy-fast-networking-for-android.html

http://kvandroidapp.blogspot.kr/2013/05/example-using-volley-google-framework.html

http://ogrelab.ikratko.com/android-volley-examples-samples-and-demos/\

https://github.com/ogrebgr/android_volley_examples\

http://blogs.captechconsulting.com/blog/raymond-robinson/google-io-2013-volley-image-cache-tutorial

구글 HTTP 마스터이자 현직 OkHTTP 개발자인 Jesse Wilson가 만든 예제 : https://github.com/swankjesse/android-http-examples/tree/master/volley-app

http://java.dzone.com/articles/android-%E2%80%93-volley-library

https://github.com/adamrocker/volley

https://github.com/carlemil/VolleyDemo/tree/Sebastian_blog_question

http://www.technotalkative.com/android-volley-library-example/



참고 사이트

https://www.itsalif.info/content/android-volley-tutorial-http-get-post-put

https://gist.github.com/benelog/5981448

http://d2.naver.com/helloworld/1258547

저작자 표시 비영리 변경 금지
신고

WRITTEN BY
빅터크룸
머 먹고 사냐.....

받은 트랙백이 없고 , 댓글이 없습니다.
secret

[Original Post]

https://www.itsalif.info/content/android-volley-tutorial-http-get-post-put


[Download JAR]

http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.mcxiaoke.volley%22


[GitHub]

https://github.com/mcxiaoke/android-volley


----------

Google released Android Volley Library around May/June 2013, which has been internally used by Google for some time. It is supposed to provide Fast Networking Operations and also takes care of Threads nicely. If you are unfamiliar with Volley, please see Google I/O 2013 Video

Unfortunately, there is almost no documentation on Volley. So, I put together code snippets on how to make Volley HTTP Requests (GET, POST, PUT, DELETE).


[Setting up Android Volley Library]

Setting up is straight-forward. Clone the Volley project from here and then import the Volley into project. A comprehensive tutorial on setting up can be found here.


[Key Classes of Android Volley]

The following are the Key classes of Volley:

– RequestQueue: A Queue containing the Network/HTTP Requests that needs to be made.

– Request: A Base Class which contains Network related information like HTTP Methods.

– StringRequest: HTTP Request where the response is parsed a String. View Source

– JsonObjectRequest: HTTP Request where the response is JSONObject. View Source



[Getting Started with Android Volley]

At first make a RequestQueue, which holds the HTTP Requests. View Source. Ideally, the RequestQueue should be made once and then referred to it across the Application. The Application is an ideal place to make it.

--------------

RequestQueue queue = Volley.newRequestQueue(this);  // this = context



[Making GET Requests]

Making GET Requests is simple. The example below uses JsonObjectRequest. It prepares a JsonObjectRequest and

passes and then adds it to RequestQueue. The JsonObject accepts 4 parameters (Http method, Url, Json values, Response Listener – Invoked on success, Error Listener – Invoked on failure).

-------------

final String url = "http://httpbin.org/get?param1=hello";

 

// prepare the Request

JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null,

    new Response.Listener<JSONObject>() 

    {

        @Override

        public void onResponse(JSONObject response) {   

                        // display response     

            Log.d("Response", response.toString());

        }

    }, 

    new Response.ErrorListener() 

    {

         @Override

         public void onErrorResponse(VolleyError error) {            

            Log.d("Error.Response", response);

       }

    }

);

 

// add it to the RequestQueue   

queue.add(getRequest);



[Making POST Requests]

For a POST request, to add form parameters/values, the getParams() method needs to be overridden and a Map needs to be returned.

----------------

url = "http://httpbin.org/post";

StringRequest postRequest = new StringRequest(Request.Method.POST, url, 

    new Response.Listener<String>() 

    {

        @Override

        public void onResponse(String response) {

            // response

            Log.d("Response", response);

        }

    }, 

    new Response.ErrorListener() 

    {

         @Override

         public void onErrorResponse(VolleyError error) {

             // error

             Log.d("Error.Response", response);

       }

    }

) {     

    @Override

    protected Map<String, String> getParams() 

    {  

            Map<String, String>  params = new HashMap<String, String>();  

            params.put("name", "Alif");  

            params.put("domain", "http://itsalif.info");

             

            return params;  

    }

};

queue.add(postRequest);



[Making PUT Requests]

Creating PUT Request is same as POST basically.

---------------

url = "http://httpbin.org/put";

StringRequest putRequest = new StringRequest(Request.Method.PUT, url, 

    new Response.Listener<String>() 

    {

        @Override

        public void onResponse(String response) {

            // response

            Log.d("Response", response);

        }

    }, 

    new Response.ErrorListener() 

    {

         @Override

         public void onErrorResponse(VolleyError error) {

                         // error

             Log.d("Error.Response", response);

       }

    }

) {

 

    @Override

    protected Map<String, String> getParams() 

    {  

            Map<String, String>  params = new HashMap<String, String> ();  

            params.put("name", "Alif");  

            params.put("domain", "http://itsalif.info");

             

            return params;  

    }

 

};

 

queue.add(putRequest);



[Making DELETE Requests]

------------

url = "http://httpbin.org/delete";

StringRequest dr = new StringRequest(Request.Method.DELETE, url, 

    new Response.Listener<String>() 

    {

        @Override

        public void onResponse(String response) {

            // response

            Toast.makeText($this, response, Toast.LENGTH_LONG).show();

        }

    }, 

    new Response.ErrorListener() 

    {

         @Override

         public void onErrorResponse(VolleyError error) {

             // error.

              

       }

    }

);

queue.add(dr);



저작자 표시 비영리 변경 금지
신고

WRITTEN BY
빅터크룸
머 먹고 사냐.....

받은 트랙백이 없고 , 댓글이 없습니다.
secret