Volley 라이브러리 : 웹 요청과 응답을 단순화하기 위해 만들어진 라이브러리

                                 스레드, 핸들러를 사용하지 않아도 되는 장점이 있음.

 

 

🚩Volley 사용하기

지난번 예제랑 비슷하다. 단지 Volley를 사용하는 걸로 바뀐 것 뿐.

 

[ Volley 사용하는 순서 ]

1. 요청(Request) 객체를 만든다.

2. 요청 큐(RequestQueue)에 요청 객체를 넣는다.

이러면 알아서 요청 큐가 웹 서버에 요청하고 응답까지 받아줌.

 

 

1️⃣build.gradle

dependencies {
    implementation("com.android.volley:volley:1.2.1")

 

2️⃣activity_main.xml

저번 거랑 동일하게 만든다.

 

3️⃣AndroidManifest.xml

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

    <application
        android:usesCleartextTraffic="true"

 

4️⃣MainActivity.java

🔹전체코드🔹

더보기
package com.example.chapter10_4;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    TextView textView;
    static RequestQueue requestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editTextText);
        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                makeRequest(); // makeRequest 메서드 작성
            }
        });

        if(requestQueue==null){ // requestQueue 객체 생성하기
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }
    }


    private void makeRequest() {
        String url = editText.getText().toString();

        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                textView.append("응답->"+response+"\n");
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        textView.append("에러->"+error.getMessage()+"\n");
                    }
                })

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

        request.setShouldCache(false);
        requestQueue.add(request);
        textView.append("요청 보냄.\n");
    }
}

 

🔹MainActivity🔹

public class MainActivity extends AppCompatActivity {
    EditText editText;
    TextView textView;
    static RequestQueue requestQueue;

RequestQueue 객체를 정의한다. 요청 큐는 한 번만 만들어 계속 사용할 수 있기 때문에 static 키워드로 클래스 변수를 선언한 후에 할당한다. (요청 큐는 한 액티비티에서만 사용하지 않고 보통 앱 전체에서 사용하기 때문에, Application 클래스 안에 넣어두거나 별도의 클래스를 하나 만들어서 넣어둔다.)

 

 

🔹onCreate🔹

if(requestQueue==null){ // requestQueue 객체 생성하기
        requestQueue = Volley.newRequestQueue(getApplicationContext());
}

Volley.newRequestQueue 메서드로 requestQueue 객체를 생성한다.

 

 

🔹onClick🔹

public void onClick(View view) {
     makeRequest(); // makeRequest 메서드 작성
}

버튼 클릭 시 makeRequest 메서드를 실행한다.

 

 

🔹makeRequest🔹

지난 예제의 코드보다 덜 복잡한 것 같기도 하고.. 아닌 것 같기도 하고.. 그래도 형태는 저번보다 쬐금 단순해 보인다.

  1. StringRequest 객체를 만든다. (4개의 파라미터 전달)
  2. getParams 메서드를 재정의
  3. 캐시 설정, 요청 객체 넣기
private void makeRequest() {
    String url = editText.getText().toString();

    // StringRequest : 문자열을 주고 받기 위해 사용하는 요청 객체
    // 요청 객체를 new 연산자로 만들 때는 4개의 파라미터를 전달할 수 있다.
    StringRequest request = new StringRequest(Request.Method.GET,/*파라미터1: GET 또는 POST 메서드 전달*/
        
    url,/*파라미터2: 웹사이트 주소 전달*/
        
    new Response.Listener<String>() { /*파라미터3: 응답받을 리스너 객체 전달*/
        @Override
        public void onResponse(String response) { // onResponse : 응답을 받았을 때 자동 호출됨.
            textView.append("응답->"+response+"\n");
        }
    },
            new Response.ErrorListener() { /*파라미터4: 에러가 발생했을 때 호출될 리스너 객체 전달*/
                @Override
                public void onErrorResponse(VolleyError error) {
                    textView.append("에러->"+error.getMessage()+"\n");
                }
            })

    {
        @Nullable
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String,String> params = new HashMap<String, String>();
            // 만약 GET이 아닌 POST 방식을 사용할 경우 HashMap 객체(params)에 파라미터 값들을 넣어주면 됨.
            return params;
        }
    };

    request.setShouldCache(false); // 이전 응답 결과를 사용하지 않겠다면 setShouldCache(false)로 설정.
    requestQueue.add(request); // add 메서드로 요청 큐에 요청 객체를 넣는다.
    textView.append("요청 보냄.\n");
}

 

 

5️⃣실행 결과

지난번 결과와 동일함. 근데 이번엔 한번 책에 나온 주소가 아닌 걸로 입력해보았다.

 

제대로 된 url을 입력했으나 반환되는 내용이 없으면 null,

아예 이상한 url을 입력하면 BAD URL

이런 식으로 에러 상황에 맞게 에러메시지가 뜨는 것을 확인할 수 있었다.