iOS를 배우는 iOS 개발자의 두 부분으로 구성된 질문은 JSON에서 이미지, 오디오 및 비디오의 스트리밍 다운로드에 이르기까지 다양한 요청을하는 Android 프로젝트에서 작업합니다.
iOS를 배우는 iOS 개발자의 두 부분으로 구성된 질문은 JSON에서 이미지, 오디오 및 비디오의 스트리밍 다운로드에 이르기까지 다양한 요청을하는 Android 프로젝트에서 작업합니다.
답변:
누군가가 각각의 최상의 사용 사례에 대한 구체적인 예를 제공 할 수 있기를 바랍니다.
웹 서비스와 통신하는 경우 Retrofit을 사용하십시오. 이미지를 다운로드하는 경우 피어 라이브러리 Picasso를 사용하십시오. Retrofit / Picasso 외부에있는 HTTP 작업을 수행해야하는 경우 OkHTTP를 사용하십시오.
발리는 대략 Retrofit + Picasso와 경쟁합니다. 장점은 하나의 라이브러리입니다. 마이너스 측면에서, 그것은 문서화되지 않은 하나이며 , 지원되지 않는 "벽에 코드를 던져서 그 위에 I | O 프리젠 테이션을한다"라이브러리입니다.
수정-발리는 이제 공식적으로 Google에서 지원합니다. 친절하게 구글 개발자 가이드를 참조하십시오
내가 읽은 것에서 OkHTTP는 3 중 가장 강력합니다.
개조는 가능하면 OkHTTP를 자동으로 사용합니다. Jake Wharton의 Volist와 OkHTTP를 연결 하는 요지 가 있습니다 .
이 프로젝트의 요구 사항을 처리 할 수 있습니다 (위에서 언급).
아마도 "스트리밍"의 일반적인 정의에 따라 "오디오 및 비디오의 스트리밍 다운로드"에 이들 중 어느 것도 사용하지 않을 것입니다. 대신 Android의 미디어 프레임 워크가 해당 HTTP 요청을 처리합니다.
즉, 자체 HTTP 기반 스트리밍을 시도하려는 경우 OkHTTP는 해당 시나리오를 처리해야합니다. 발리가 그 시나리오를 얼마나 잘 처리했는지는 기억 나지 않습니다. Retrofit이나 Picasso는 그러한 용도로 설계되지 않았습니다.
발리 관점을 보면 다음과 같은 요구 사항이 있습니다.
발리는 개별적인 작은 HTTP 요청을 처리하는 데 전적으로 집중합니다. 따라서 HTTP 요청 처리에 약간의 문제가 있다면 Volley는 아마도 당신에게 갈고리가 있습니다. 반면에 이미지 처리에 문제가있는 경우 유일한 유일한 후크는 ImageCache 입니다. "아무것도 아니지만, 많이 아니에요!". 그러나 요청을 정의하면 조각이나 활동 내에서 요청을 사용하는 것이 병렬 AsyncTasks와 달리 고통스럽지 않습니다.
발리의 장단점 :
발리의 장점은 무엇입니까?
네트워킹 부분은 이미지만을위한 것이 아닙니다. 발리는 백엔드에서 없어서는 안될 부분입니다. 간단한 REST 서비스를 기반으로 한 새로운 프로젝트의 경우 큰 승리가 될 수 있습니다.
NetworkImageView는 Picasso보다 요청 정리에 더 적극적이며 GC 사용 패턴에서 더 보수적입니다. NetworkImageView는 강력한 메모리 참조에 전적으로 의존하며 ImageView에 대한 새 요청이 이루어 지거나 ImageView가 화면 밖으로 이동하는 즉시 모든 요청 데이터를 정리합니다.
공연. 이 글은이 주장을 평가하지는 않지만, 메모리 사용 패턴에서 신중하게주의를 기울였습니다. Volley는 또한 컨텍스트 전환을 줄이기 위해 메인 스레드에 콜백을 배치하려고합니다.
발리에는 분명히 미래도 있습니다. 관심이 있으시면 RequestFuture를 확인하십시오.
고해상도 압축 이미지를 다루는 경우 Volley가 유일하게 효과적인 솔루션입니다.
발리는 Okhttp와 함께 사용할 수 있습니다 (Okhttp의 새로운 버전은 더 나은 성능을 위해 NIO를 지원합니다)
발리는 활동 라이프 사이클과 잘 어울립니다.
발리 문제 :
발리는 새로운 것이기 때문에 아직 지원되지 않는 것은 거의 없지만 수정되었습니다.
멀티 파트 요청 (솔루션 : https://github.com/vinaysshenoy/enhanced-volley )
상태 코드 201은 오류로 간주되며, 상태 코드 200-207은 이제 성공적으로 응답합니다 (고정 : https://github.com/Vinayrraj/CustomVolley )
업데이트 : Google 발리 최신 릴리스에서 2XX 상태 코드 버그가 수정 되었습니다! Ficus Kirkpatrick에게 감사합니다!
덜 문서화되었지만 많은 사람들이 github에서 발리를 지원하고 있습니다 .java와 같은 문서는 여기 에서 찾을 수 있습니다 . 안드로이드 개발자 웹 사이트에서 Volley를 사용하여 네트워크 데이터 전송을 위한 가이드를 찾을 수 있습니다 . 발리 소스 코드는 Google Git 에서 찾을 수 있습니다.
Volley Framework 의 리디렉션 정책 을 해결 / 변경하려면 Volley를 OkHTTP와 함께 사용 하십시오 (위에서 언급 한 CommonsWare)
또한 Picasso를 사용 하여이 비교 발리의 이미지 로딩을 읽을 수 있습니다
개조 :
Square 에 의해 출시되었으며 , REST API를 사용하기 매우 쉽습니다 (NIO 지원으로 업데이트! Voila!).
개조의 장점 :
Volfit에 비해 Retrofit의 REST API 코드는 간단하고 뛰어난 API 문서를 제공하며 커뮤니티에서 훌륭한 지원을 제공합니다! 프로젝트에 추가하는 것은 매우 쉽습니다.
오류 처리와 함께 모든 직렬화 라이브러리에서 사용할 수 있습니다.
업데이트 : -Retrofit 2.0.0-beta2에는 많은 변화가 있습니다.
버전 1.6에 대한 Retrofit의 단점 :
메모리 관련 오류 처리 기능이 좋지 않습니다 (이전 버전 Retrofit / OkHttp의 경우). Java NIO를 지원하는 Okio로 개선되었는지 확실하지 않습니다.
우리가 부적절한 방식으로 이것을 사용하면 최소한의 스레딩 지원이 지옥을 불러 일으킬 수 있습니다.
(위의 모든 단점은 Retrofit 2.0 베타의 새로운 버전에서 해결되었습니다)
===================================================== ======================
최신 정보:
Android Async vs Volley vs Retrofit 성능 벤치 마크 (밀리 초, 값이 낮을수록 좋음) :
(OKhttp의 새로운 버전은 NIO Okio 라이브러리에 의존하기 때문에 Retrofit Benchmarks 정보 위의 FYI는 java NIO 지원으로 향상됩니다)
다양한 반복 (1 – 25 회)을 사용한 세 가지 테스트 모두에서 발리는 50 % ~ 75 % 더 빨랐습니다. 개조는 AsyncTasks보다 50 % ~ 90 % 빠른 속도로 클럭킹하여 같은 횟수로 같은 엔드 포인트에 도달했습니다. 대시 보드 테스트 스위트에서는 데이터를 몇 초 더 빠르게로드 / 파싱했습니다. 그것은 실제와의 큰 차이입니다. 테스트를 공정하게하기 위해 AsyncTasks / Volley의 시간에는 Retrofit이 자동으로 수행하는 것처럼 JSON 구문 분석이 포함되었습니다.
RetroFit 벤치 마크 테스트에서 승리합니다!
결국 우리는 응용 프로그램을 위해 Retrofit과 함께하기로 결정했습니다. 엄청나게 빠를뿐만 아니라 기존 아키텍처와 매우 잘 맞습니다. API를 거의 또는 전혀 노력하지 않고 오류 처리, 캐싱 및 페이지 매김을 자동으로 수행하는 부모 콜백 인터페이스를 만들 수있었습니다. Retrofit을 병합하기 위해 변수 이름을 바꿔서 GSON 호환 모델을 만들고 간단한 인터페이스 몇 개를 작성하고 이전 API에서 함수를 삭제하고 AsyncTasks를 사용하지 않도록 조각을 수정해야했습니다. 이제 몇 개의 조각이 완전히 변환되었으므로 고통스럽지 않습니다. 우리가 극복해야 할 고통과 문제가 조금 있었지만 전반적으로 순조롭게 진행되었습니다. 처음에는 몇 가지 기술적 문제 / 버그가 발생했지만 Square에는 환상적인 Google+ 커뮤니티가있어이를 해결할 수있었습니다.
발리를 언제 사용해야합니까?!
우리는 REST API를 소비 할뿐만 아니라 이미지를로드해야 할 때 발리를 사용할 수 있습니다! 네트워크 요청 큐잉 시스템은 많은 n / w 요청에 동시에 필요합니다! Volley는 Retrofit보다 메모리 관련 오류 처리 기능이 우수합니다!
OkHttp 는 Volley와 함께 사용할 수 있으며 Retrofit은 기본적으로 OkHttp 를 사용합니다 ! 그것은이 SPDY 지원, 연결 풀링, 디스크 캐싱, 투명 압축을! 최근 Okio 라이브러리를 사용 하여 java NIO를 약간 지원 합니다.
출처, 크레딧 : Mr. Josh Ruesch의 volley-vs-retrofit
참고 : 스트리밍 정보는 RTSP / RTCP와 같은 스트리밍 유형에 따라 다릅니다.
MultipartEntityBuilder
에 대해서는 httpmime
라이브러리 에서 사용할 수 있다고 생각 합니다.
RoboSpice Vs. 발리
에서 https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
compile 'com.mcxiaoke.volley:library:1.0.+'
Android 용 AF 네트워킹 :
빠른 Android 네트워킹 라이브러리는 GET, POST, DELETE, HEAD, PUT, PATCH와 같은 모든 유형의 HTTP / HTTPS 요청을 지원합니다
빠른 Android 네트워킹 라이브러리는 모든 유형의 파일 다운로드를 지원합니다
빠른 Android 네트워킹 라이브러리는 모든 유형의 파일 업로드를 지원합니다 (멀티 파트 업로드 지원)
빠른 Android 네트워킹 라이브러리는 요청 취소 지원
빠른 Android 네트워킹 라이브러리는 모든 요청 (LOW, MEDIUM, HIGH, IMMEDIATE)에 대한 우선 순위 설정을 지원합니다.
RxJava를 지원하는 빠른 Android 네트워킹 라이브러리
OkHttp를 네트워킹 계층으로 사용하므로 다음을 지원합니다.
빠른 Android 네트워킹 라이브러리는 HTTP / 2 지원을 지원하므로 동일한 호스트에 대한 모든 요청이 소켓을 공유 할 수 있습니다
빠른 Android 네트워킹 라이브러리는 연결 풀링을 사용하여 요청 대기 시간을 줄입니다 (HTTP / 2를 사용할 수없는 경우).
투명한 GZIP로 다운로드 크기 축소
빠른 Android 네트워킹 라이브러리는 응답 캐싱을 지원하여 반복 요청에 대해 네트워크를 완전히 피합니다.
고마워 : 도서관은 나에 의해 만들어졌다
비동기 HTTP 클라이언트 loopj와 Volley
내 프로젝트의 세부 사항은 1-5 분마다 작은 HTTP REST 요청입니다.
비동기 HTTP 클라이언트 (1.4.1)를 오랫동안 사용하고 있습니다. 성능은 바닐라 Apache httpClient 또는 HTTP URL 연결을 사용하는 것보다 낫습니다. 어쨌든, 새로운 버전의 라이브러리가 작동하지 않습니다 : 라이브러리 간 예외 컷 콜백 체인.
모든 답을 읽으면 새로운 것을 시도하게되었습니다. Volley HTTP 라이브러리를 선택했습니다.
테스트 없이도 일정 시간 동안 사용한 후에는 응답 시간이 1.5 배, 2 배로 감소한 것을 알 수 있습니다.
아마도 Retrofit이 비동기 HTTP 클라이언트보다 낫습니까? 나는 그것을 시도해야합니다. 그러나 나는 발리가 나를위한 것이 아니라고 확신한다.
Volley를 사용한 경험에서 얻은 토론에 약간의 내용을 추가하기 만하면됩니다.
발리는 어떤 식 으로든 스트리밍 업로드 또는 다운로드를 처리하지 않습니다. 즉, 전체 요청 본문이 메모리에 OutputStream
있어야하며 기본 소켓처럼 요청 본문을 기본 소켓에 쓰는 데 또는를 사용 InputStream
하여 응답 본문을 읽을 수 없습니다 HttpURLConnection
. 따라서 Volley는 대용량 파일을 업로드하거나 다운로드하기에 적합하지 않습니다. 귀하의 요청과 응답은 작아야합니다. 이것은 제가 개인적으로 겪은 발리의 가장 큰 한계 중 하나입니다. 가치가있는 것을 위해 OkHttp에는 스트림 작업을위한 인터페이스가 있습니다.
공식 문서의 부족은 성가신 일이지만, 소스 코드를 읽음으로써 해결할 수 있었지만 따라하기가 쉽지 않습니다. 더 귀찮은 것은 발리가 공식 릴리스 버전과 Maven 또는 Gradle 아티팩트를 가지고 있지 않기 때문에 종속성으로 관리하는 것이 스퀘어가 출시 한 라이브러리보다 두통이 더 많다는 것입니다 . 리포지토리를 복제하고 항아리를 만들면 나름대로입니다. 버그 수정을 찾고 있습니까? 가져 와서 거기에 있기를 바랍니다. 다른 것들도 얻을 수 있습니다. 문서화되지 않습니다. 제 생각에 이것은 코드베이스가 합리적으로 활성화되어 있지만 Volley가 지원되지 않는 타사 라이브러리라는 것을 의미합니다. 주의 사항
기본적으로 Content-Type을 클래스 / 요청 유형 (JsonObjectRequest, ImageRequest 등)에 묶는 것은 다소 까다 롭고 Volley의 기존 요청 유형 계층 구조에 묶여 있기 때문에 호출 코드의 유연성이 약간 떨어집니다. 나는 Content-Type을 다른 헤더처럼 헤더로 설정하는 것이 간단합니다 (Volley에서는 그렇게하지 마십시오. 두 개의 Content-Type 헤더로 끝날 것입니다!). 그것은 내 개인적인 의견 일뿐이며 해결할 수 있습니다.
발리가 유용한 기능을 가지고 있지 않다는 것은 아닙니다. 확실히 그렇습니다. 쉽게 사용자 지정할 수있는 재시도 정책, 투명 캐싱, 취소 API 및 요청 스케줄링 및 동시 연결 지원은 훌륭한 기능입니다. 모든 HTTP 사용 사례 (위의 항목 1 참조)를위한 것은 아니며 Volley를 앱에서 프로덕션 용도로 사용하는 데 어려움이 있음을 아십시오 (항목 2).
나는 최근 에 테이블에 약간의 여분을 가져 오는 ion 이라는 lib를 발견했습니다 .
ion은 ImageView, JSON (GSON의 도움으로), 파일 및 매우 편리한 UI 스레딩 지원과 통합 된 이미지 다운로드를 기본적으로 지원합니다.
나는 그것을 새로운 프로젝트에서 사용하고 있으며 지금까지 결과는 좋았습니다. 사용은 Volley 또는 Retrofit보다 훨씬 간단합니다.
허용 된 답변과 LOG_TAG가 말한 내용에 추가 .... Volley가 백그라운드 스레드에서 데이터를 구문 분석 Request<YourClassName>
하려면 onResponse
메소드가 기본 스레드에서 호출되고 기본 스레드에서 구문 분석하면 응답이 있으면 UI가 지연 될 수 있으므로 서브 클래스 화해야합니다 크다. 어떻게하는지 여기 를 읽으 십시오 .
내 앱에서 둘 다 사용하고 있습니다.
중첩 된 JSON 클래스를 구문 분석 할 때마다 Robospice가 Retrofit보다 빠르게 작동합니다. Spice Manger가 당신을 위해 모든 것을 해줄 것이기 때문입니다. Retrofit에서는 GsonConverter를 생성하고 역 직렬화해야합니다.
같은 활동에서 두 개의 조각을 만들고 같은 종류의 두 URL로 같은 시간을 호출했습니다.
09-23 20:12:32.830 16002-16002/com.urbanpro.seeker E/RETROFIT﹕ RestAdapter Init
09-23 20:12:32.833 16002-16002/com.urbanpro.seeker E/RETROFIT﹕ calling the method
09-23 20:12:32.837 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ initialzig spice manager
09-23 20:12:32.860 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ Executing the method
09-23 20:12:33.537 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ on SUcceess
09-23 20:12:33.553 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ gettting the all contents
09-23 20:12:33.601 16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation starts
09-23 20:12:33.603 16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation ends
그리고 또 다른 옵션 : https://github.com/apptik/jus
마커, 변압기 등과 같은 다른 많은 편리한 기능들