[Android] 5. 네트워킹 - Volley 사용하기
안녕하세요 이번 시간에는 5강 네트워킹의 네번째 강의인 '웹으로 요청하기' 리뷰입니다.
마찬가지로 개념을 알아보면서 실습한 내용을 덧붙여 알아보도록 하겠습니다!
웹서버에 요청하고 응답을 받을 때는 HttpURLConnection을 사용할 수 있지만 요청과 응답을 위한 코드의 양이 많은 데다가 스레드를 사용하면서 더 많은 코드를 넣어주게 됩니다.
이때 안드로이드에서 제공하는 HTTP 라이브러리, Volley를 사용하면 쉽고 빠르게 네트워크 통신을 할 수 있습니다.
Volley 라이브러리는 웹 요청과 응답을 단순화시키기 위해 만들어진 라이브러리들 중의 하나입니다.
먼저 요청(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를 업데이트할 수 있도록 합니다.
글 읽어주셔서 감사합니다 :)