본문 바로가기
안드로이드

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

qbang 2019. 7. 29.

안녕하세요 이번 시간에는 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를 업데이트할 수 있도록 합니다.

 

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

댓글