안드로이드

[Android] 5. 네트워킹 - Volley 사용하기

qbang 2019. 7. 29. 13:38

안녕하세요 이번 시간에는 5강 네트워킹의 네번째 강의인 '웹으로 요청하기' 리뷰입니다.

마찬가지로 개념을 알아보면서 실습한 내용을 덧붙여 알아보도록 하겠습니다!

 


웹서버에 요청하고 응답을 받을 때는 HttpURLConnection을 사용할 수 있지만 요청과 응답을 위한 코드의 양이 많은 데다가 스레드를 사용하면서 더 많은 코드를 넣어주게 됩니다.

이때 안드로이드에서 제공하는 HTTP 라이브러리, Volley를 사용하면 쉽고 빠르게 네트워크 통신을 할 수 있습니다.

 

Volley 라이브러리는 웹 요청과 응답을 단순화시키기 위해 만들어진 라이브러리들 중의 하나입니다.

Volley 동작 과정(출처: https://www.edwith.org/boostcourse-android/lecture/17091/)

먼저 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(RequestQueue)라는 곳에 넣어주면 요청 큐가 알아서 웹서버에 요청하고 응답까지 받아옵니다.

implementation 'com.android.volley:volley:1.1.0'

Volley는 외부 라이브러리 이므로 build.gradle(Module: app) 파일을 열고 dependencies 안에 라이브러리 정보를 추가해줍니다.

<uses-permission android:name = "android.permission.INTERNET"/>

그리고 AndroidManifest.xml에 인터넷 권한을 부여해주는 코드를 추가해줍니다.

 

AppHelper.java

package com.example.myvolley;

import com.android.volley.RequestQueue;

public class AppHelper {

    public static RequestQueue requestQueue;

}

Request 객체는 일반적으로 애플리케이션 안에다가 넣는 것이 권장됩니다. 그래서 class를 따로 만들어보았습니다.

 

MainActivity.java

package com.example.myvolley;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                sendRequest();
            }
        });

        if(AppHelper.requestQueue == null) {
            AppHelper.requestQueue = Volley.newRequestQueue(getApplicationContext());
        }

    }
    public void println(String data){
        textView.append(data + "\n");
    }
    public void sendRequest(){
        String url = "http://www.google.co.kr";
        StringRequest request = new StringRequest(
                //요청방식 지정
                Request.Method.GET,
                //웹서버의 url 정보를 전달
                url,
                //응답을 성공적으로 받았을 때 이 리스너의 onResponse 메소드를 자동으로 호출해주는 리스너 객체
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        println("응답 -> "+response);
                    }
                },
                //에러가 발생했을 때 호출될 리스너 객체
                new Response.ErrorListener(){
                    @Override
                    public void onErrorResponse(VolleyError error){
                        println("에러 -> "+error.getMessage());
                    }
                }
            ){ //POST 방식으로 파라미터를 넣음 -> request 객체안에 메소드를 재정의


            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params = new HashMap<String, String>();

                return params;
            }
        };

        //매번 받은 새로운 결과를 출력
        request.setShouldCache(false);
        AppHelper.requestQueue.add(request);
        println("요청 보냄");
        }
   }

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="요청하기" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFEB3B">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="18sp" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

위 코드에 대한 실행 결과는 아래와 같습니다.

초기 화면
결과 화면

스레드를 쓰게 되면 어느 부분이 메인 스레드로 오는지, UI를 업데이트할 수 있는 부분은 어딘지 등을 구분해야 하는데 Volley 라이브러리는 스레드를 내부에서 처리해버리기 때문에 응답을 받으면 바로 UI를 업데이트할 수 있도록 합니다.

 

글 읽어주셔서 감사합니다 :)