Volley, OkHttp, Retroffit로 비동기 통신을 각각 쓸 때의 초간단 견본

18167 단어 AndroidRetrofitOkHttp

개시하다


이 글은 드라이드 카이지가 2017년 발표한'이제 Android 6.0 ~ Android 7.0 에서 8 로 대응합니다.응시의 보완 글이다.

개요


Apache HTTP 클라이언트는 안드로이드 6.0에서 폐지됩니다.특히 구글이 제공하는 커뮤니케이션 라이브러리'볼리'가 이 영향을 받았다.
내가 이전에 일했던 응용 프로그램도 기본적으로 모두 Volley를 사용했다.최종적으로 OkHttp과 Retrofit로의 이전을 통해 대응했지만 (특히 OkHttp로의) 이전이 비교적 순조로웠기 때문에'각 프로그램 라이브러리에서 비동기 통신을 실시한 경우'라는 샘플을 다시 게재했다.

useLibrary 'org.apache.http.legacy


Apache HTTP 클라이언트 | Android 6.0 변경 사항 삭제 | Android Developers
실제로 공식적으로는'어떻게든 아파치 HTTP 클라이언트를 사용하고 싶을 때 응급 해결 방안'을 마련했다.
비록 이렇게 말하지만, 나는 이것이 단지 긴급한 해결 방법일 뿐이라고 생각한다.언제 공식적으로 삭제될지 명시적으로 밝히지는 않았지만, 삭제하지 않으면 처음부터 배제될 수 없기 때문에 아파치 HTTP 셀리언트가 필요 없는 형태로 조속히 바뀌어야 한다.
그나저나 이에 대응하는 Volley가 GiitHub로 올라갔다.본 보도의 Volley 샘플도 우리의 Volley를 이용하여 실시한 것이다.둘 다 Apache HTTP 클라이언트의 대응이 완료되었을 수 있습니다.
  • google/volley
  • Transmitting Network Data Using Volley | Android Developers
  • 이루어지다


    클라이언트 클래스의 포장 클래스에 대한 실현


    정답입니다!입이 찢어져도 말할 수 없지만 전이 대상인 응용의 통신처리는 별도의 가방에 통신처리된 센터류에 대한 대화로 설계됐다.이렇게 되면 뷰 측에서 어떻게 모델들을 얻느냐는 의식이 없어져 변경점도 최소한에 그치는 느낌이다.

    MVP, MVM 등'아름다운'의존 관계를 만들어야 하는데 갑자기 다 완벽하게 해내는 건 어려운 일이다.그렇긴 하지만 이 정도의'View에 의존하지 않는 프로그램 라이브러리'의 등급 분할을 먼저 한 다음에 OkHttp 등으로 옮기는 것이 순조로울 것 같다.

    샘플 코드


    이번에는 과도적 응용에 적응하는 조건을 전제로 한 거예요.
  • GET 통신
  • JSON을 반환해야 하므로 Gson으로 세척
  • 주로 비동기식 통신
  • 이런 전제하에 기재되어 있다.결국'실장 방법은 크게 다르지 않다'는 느낌일 뿐이니 직접 생각해서 흉내내지 마세요.
    RequestClient.java
    class RequestClient {
    
        private static final String URL = "https://xxxx.com/get/event/";
        static final int METHOD_VOLLEY = 0;
        static final int METHOD_OKHTTP = 1;
        static final int METHOD_RETROFIT = 2;
    
        interface Listener {
            void onSuccess(Event event);
    
            void onFailure();
        }
    
        private Listener mListener;
    
        private RequestQueue mRequestQueue; // Volley
        private OkHttpClient mOkHttpClient; // OkHttp
    
        RequestClient(Context context, Listener listener) {
            this.mListener = listener;
            this.mRequestQueue = Volley.newRequestQueue(context);
            this.mOkHttpClient = new OkHttpClient();
        }
    
        /**
         * GET通信の実施(取得するURLは固定)
         *
         * @param method 利用するライブラリの種類
         */
        void get(int method) {
    
            if (method == METHOD_VOLLEY) {
                getVolley(mListener);
                return;
            }
    
            if (method == METHOD_OKHTTP) {
                getOkHttp(mListener);
                return;
            }
    
            if (method == METHOD_RETROFIT) {
                getRetrofit(mListener);
                return;
            }
    
            mListener.onFailure();
        }
    
        /**
         * Volleyによる非同期GET通信
         *
         * @param listener リスナー
         */
        private void getVolley(final Listener listener) {
            JsonObjectRequest request
                    = new JsonObjectRequest(Request.Method.GET, URL, null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Event event = new Gson().fromJson(response.toString(), Event.class);
                            listener.onSuccess(event);
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            listener.onFailure();
                        }
                    });
            mRequestQueue.add(request);
            mRequestQueue.start();
        }
    
        /**
         * OkHttp3による非同期GET通信
         *
         * @param listener リスナー
         */
        private void getOkHttp(final Listener listener) {
            final okhttp3.Request request = new okhttp3.Request.Builder().url(URL).get().build();
            mOkHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    listener.onFailure();
                }
    
                @Override
                public void onResponse(Call call, okhttp3.Response response) throws IOException {
                    Event event = new Gson().fromJson(response.body().string(), Event.class);
                    listener.onSuccess(event);
                }
            });
        }
    
        /**
         * Retrofit用のインターフェース:本当は別ファイルに定義した方がいいと思います
         */
        interface Api {
            @GET("get/event/")
            retrofit2.Call<Event> api();
        }
    
        /**
         * Retrofit2による非同期GET通信
         *
         * @param listener リスナー
         */
        private void getRetrofit(final Listener listener) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://xxxx.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            Api api = retrofit.create(Api.class);
    
            api.api().enqueue(new retrofit2.Callback<Event>() {
                @Override
                public void onResponse(retrofit2.Call<Event> call, retrofit2.Response<Event> response) {
                    listener.onSuccess(response.body());
                }
    
                @Override
                public void onFailure(retrofit2.Call<Event> call, Throwable t) {
                    listener.onFailure();
                }
            });
        }
    }
    
    보시다시피 Retroffit의 준비 부분만 독특하지만 통신에서 시작된 호출 프로세스와 Volley는 거의 변화가 없다.하나를 옮기는 데 시간이 걸릴 수도 있지만 그 이후에는 순조롭게 진행될 수 있잖아요.

    주의 사항(OkHttp 및 Retroffit의 관계성 정보)


    Retroffit는 OkHttp를 기반으로 제작된 라이브러리이기 때문에 OkHttp와 Retroffit의 OkHttp 버전이 다를 수 있습니다(번거로움).
    약 반년 전부터 OkHttp 자체가 v3를 공개했고, Retroffit 내 OkHttp는 v2를 사용했고, 지금은 v3를 사용하고 있다.
    이러한'편차'도 있기 때문에 프로그램 라이브러리의 채택과 업데이트의 대응에 충분히 주의하십시오.
    square/retrofit: Type-safe HTTP client for Android and Java by Square, Inc.

    참조 링크

  • google/volley
  • square/okhttp: An HTTP+HTTP/2 client for Android and Java applications.
  • square/retrofit: Type-safe HTTP client for Android and Java by Square, Inc.
  • 좋은 웹페이지 즐겨찾기