ANDROID/Android 앱 프로그래밍

[Android] Volley 사용하기

주 녕 2021. 7. 1. 01:24
728x90

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 

 

Volley 라이브러리

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

  • 사용법
    1. 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(RequestQueue)라는 곳에 넣어줌
    2. 요청 큐(RequestQueue)가 알아서 웹서버에 요청하고 응답까지 받아줌.
    3. 응답을 받을 수 있도록 메서드를 만들어두기만 하면 응답이 왔을 때 자동으로 해당 메서드 호출
  • 장점
    • 스레드(Thread)를 신경쓰지 않아도 됨
    • 요청 큐가 내부에서 스레드를 만들어 웹서버에 요청하고 응답받는 과정 진행
    • 응답을 처리할 수 있는 메서드를 호출할 때는 메인 스레드에서 처리할 수 있도록 만듦 → 핸들러(Handler) 사용할 필요 없음

 

[ 예제 ]

build.gradle(app)

dependencies 중괄호 안에 라이브러리 정보 추가 후 Sync Now

dependencies {
    ...
    implementation 'com.android.volley:volley:1.1.0'
}

 

AndroidManifest.xml

이전 '웹으로 요청하기' 포스팅과 같은 설정

<manifest ...>

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

    <application
        ...
        android:usesCleartextTraffic="true">

 

VolleyActivity.java

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_volley);
        
        editText = findViewById(R.id.volley_edittext);
        textView = findViewById(R.id.volley_textview);

        Button button = findViewById(R.id.volley_btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                makeRequest();
            }
        });
        
        // RequestQueue 객체 생성
        if (requestQueue == null) {
            requestQueue = Volley.newRequestQueue(getApplicationContext());
        }
    }
    
    public 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) {
                        println("응답-> " + response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        println("에러-> "+error.getMessage());
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                return params;
            }
        };
        
        request.setShouldCache(false);
        requestQueue.add(request);
        println("요청 보냄");
    }
    
    public void println(String data) {
        textView.append(data+"\n");
    }
}

 

  • 사용자가 버튼을 클릭했을 때 요청 객체를 만들고 요청 큐에 넣음
    • 요청 큐(RequestQueue)는 앱 전체에서 사용하는 것이 일반적 → static 키워드 사용
    • 따라서 실제 앱을 만들 때는 Application 클래스 안에 두거나 별도의 클래스를 하나 만들어서 넣어둠
    • Volley.newRequestQueue() 메서드를 사용하여 요청 큐 생성
  • 요청 객체는 StringRequest 클래스 사용
    • StringRequest 클래스는 문자열을 주고받기 위한 요청 객체이며, Volley 라이브러리 안에 여러 유형의 요청 객체 있음
    • 일반적으로 StringRequest 만으로 충분함
  • 요청 객체를 새로 할당할 때 4개의 파라미터 전달
    1.  요청 방식 지정 : GET() 또는 POST() 메서드 전달
    2. 웹 사이트 주소
    3. 응답 받을 리스너 객체 : 해당 리스터 객체의 onResponse() 메서드는 응답 받았을 때 자동 호출
    4. 에러가 발생했을 때 호출될 리스너 객체
  • 해당 예제에서는 GET 방식을 이용했지만, POST 방식을 사용하면서 요청 파라미터를 전달하려고 할 때는 getParams() 메서드에서 반환하는 HashMap 객체에 파라미터 값을 넣어주면 됨.
  • 요청 객체 생성 후에는 해당 객체를 요청 큐에 넣어줌
    • add() 메서드로 요청 객체를 넣으면 요청 큐가 자동으로 요청과 응답 과정을 진행함
    • 요청 객체는 cache 메커니즘을 지원하는데 만약 이전 응답 결과를 사용하지 않겠다면 setShouldCache() 메서드를 false
  • 결론적으로 스레드나 핸들러를 사용하지 않았는데 이전 포스팅의 결과와 같은 것을 확인할 수 있음

 

 

 

 

 

*핸들러와 이전 네트워킹 포스팅은 아래 주소로!

 

[Android] 핸들러(Handler)

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 핸들러(Handler) 새로운 프로젝트를 만들면 자동으로 생성되는 메인 액티비티는 앱이 실행될 때 하나의 프로세스에서

junyoung-developer.tistory.com

 

[Android] 웹으로 요청하기

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 웹으로 요청하기 비연결성(stateless)인 HTTP 프로토콜은 페이지 정보를 요청할 때마다 소켓을 새로 연결하고 응답을 받

junyoung-developer.tistory.com

728x90