출처: https://www.edwith.org/boostcourse-android/lecture/17091/



1. Volley

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

Volley를 사용하는 방법은 Request 객체를 만들고 이 Request 객체를 Request Queue에 넣어주면 된다.

Request Queue는 알아서 웹 서버에 요청하고 응답을 받기 때문에, 스레드를 신경 쓰지 않아도 된다.



Volley를 쓰면,

- 네트워크 Request 우선 순위를 자동으로 관리한다.

- 동시에 여러 네트워크 요청을 할 수 있다.

- 요청을 할 때 Cache 적용 여부를 의식하지 않아도 된다. 

- 요청 큐가 내부에서 스레드를 만들고 웹 서버에 요청하고 응답을 받고 나면, 메인 스레드에서 결과를 처리할 수 있도록 만든다.

  그 후에 설정한 리스너의 메소드를 호출하기 때문에, 화면에 결과를 표시할 때 핸들러를 사용하지 않아도 된다.



2. 구현 결과 화면

  



3. build.gradle (app)

Volley는 외부 라이브러리이므로 dependencies에 라이브러리를 추가한다.

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



4. AndroidManifest.xml

인터넷 권한을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tistory.qlyh8.practice">
 
    <uses-permission android:name="android.permission.INTERNET"/>
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.tistory.qlyh8.practice.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
    </application>
 
</manifest>
cs



5. activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.tistory.qlyh8.practice.MainActivity">
 
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="요청하기"/>
 
    <ScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_blue_light"
        android:padding="10dp">
        <TextView
            android:id="@+id/text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"/>
    </ScrollView>
 
</LinearLayout>
 
cs



6. AppHelper.java

1
2
3
4
5
6
7
8
9
10
package com.tistory.qlyh8.practice;
 
import com.android.volley.RequestQueue;
 
 
public class AppHelper {
    // RequestQueue 를 static 으로 만들어 어디서든 참조 가능하게 함
    public static RequestQueue requestqueue;
}
 
cs



7. MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.tistory.qlyh8.practice;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
 
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.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 = findViewById(R.id.text_view);
 
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 버튼을 클릭했을 때 request 객체를 만들고 request queue 에 넣는다.
                sendRequest();
            }
        });
 
        // request queue 는 앱이 시작되었을 때 한 번 초기화되기만 하면 계속 사용이 가능
        if(AppHelper.requestqueue == null)
            AppHelper.requestqueue = Volley.newRequestQueue(getApplicationContext());
    }
 
    public void sendRequest(){
        String url = "https://www.google.com";
 
        // 문자열을 주고 받기 위한 request 객체는 StringRequest 클래스를 이용해 만들 수 있다.
        // 요청방식, URL, 리스너, 에러 리스너를 전달한다.
        // 요청방식: GET, POST 메서드
        // URL: 웹서버의 URL 정보
        // 리스너: 응답을 성공적으로 받았을 때 리스너의 onResponse 메소드를 자동으로 호출
        // 에러 리스너: 에러가 발생했을 때 호출
        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<StringString> getParams() throws AuthFailureError {
                // 만약 POST 방식에서 전달할 요청 파라미터가 있다면 HashMap 객체에 넣어준다.
                Map<StringString> map = new HashMap<>();
                return map;
            }
        };
 
        request.setShouldCache(false); // 이전 결과가 있더라도 새로 요청해서 응답을 보여줌
        AppHelper.requestqueue.add(request); // request queue 에 request 객체를 넣어준다.
    }
 
    public void println(String str){
        textView.append(str + "\n");
    }
}
cs



참고

Volley overview | Android Developers: https://developer.android.com/training/volley/

Send a simple request | Android Developers: https://developer.android.com/training/volley/simple

+ Recent posts