본문 바로가기
Android/Concepts

Volley 라이브러리 사용법

by JuHy_ 2020. 4. 26.

Volley란?

앱에서 서버와 http 통신을 할 때 HttpURLConnection을 사용하면 직접 요청과 응답을 받는 것이 가능하다.

하지만 직접 쓰레드를 구현해야 하며, 기본적인 코드 양 또한 많아 코드가 복잡해진다는 단점이 있다.

그래서 안드로이드에서는 쉽고 빠른 http 통신을 위해 Volley 라이브러리를 제공하고 있다.

 

코드가 간결해진다는 점 외에도 다음과 같은 여러가지 장점들이 있어 http 통신에 많이 사용된다.

 

Volley 라이브러리는 다음과 같이 동작한다.

 

사용자가 Request 객체에 요청 내용을 담아 RequestQueue에 추가하기만 하면,

RequestQueue가 알아서 쓰레드를 생성하여 서버에 요청을 보내고 응답을 받는다.

응답이 오면 RequestQueue에서 Request에 등록된 ResponseListener로 응답을 전달해준다.

따라서 사용자는 별도의 쓰레드 관리 뿐 아니라 UI 접근을 위한 handler 또한 다룰 필요가 없다.

 

사용법

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

Manifest에 uses-permission 태그로 INTERNET 권한을 추가하자.

 

implementation 'com.android.volley:volley:1.1.1'

build.gradle의 dependencies에 라이브러리를 추가하자.

 

package com.juhy.myapplication;

import com.android.volley.RequestQueue;

public class AppHelper {

    public static RequestQueue requestQueue;

}

RequestQueue는 한번 생성하면 어디서든 접근할 수 있도록 AppHelper 클래스에 static으로 선언해주자.

 

package com.juhy.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;

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

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String url = editText.getText().toString();
                sendRequest(url);
            }
        });

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

    }

    public void sendRequest(String url) {

        StringRequest request = new StringRequest(
                Request.Method.GET,
                url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        textView.setText(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        textView.setText(error.getMessage());
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                //params.put("key", "value");
                return params;
            }
        };

        // 이전 결과가 있더라도 새로 요청
        request.setShouldCache(false);

        AppHelper.requestQueue.add(request);

        Toast.makeText(getApplicationContext(), "Request sent", Toast.LENGTH_SHORT).show();
    }

}

먼저 AppHelper.requestQueue가 null이라면 requestQueue를 생성한다.

그리고 버튼을 누르면 EditText로부터 url을 읽어와 요청을 보내는 sendRequest() 함수에 전달해주자.

 

sendRequest()에서는 먼저 request 객체를 생성해주자.

이 때 파라미터로는 다음과 같은 내용들을 순서대로 넣어주어야 한다.

 

1. 요청 방식 (GET 또는 POST)

2. 요청을 보낼 url

3. 응답을 받았을 때 호출될 메소드 (Response.Listener)

4. 에러가 발생했을 때 호출될 메소드 (Response.ErrorListener)

 

그리고 끝에는 { } 를 추가하여 요청을 보낼 때 포함시킬 파라미터를 넣을 수 있다.

getParams() 메소드를 override 한 뒤 Map 객체에 (key, value) 형태로 데이터를 넣어 return 해주면 된다.

 

다음엔 이미 요청한 결과가 있더라도 다시 요청이 들어오면 새로 요청하는 flag를 설정해주고,

초기화한 requestQueue에 생성한 request를 add하면 된다.

 

 

요청을 전송하면 정상적으로 응답을 받아 TextView에 띄워주는 것을 볼 수 있다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android