https://youngest-programming.tistory.com/16
참고 블로그
웹 서버에 요청하고 응답을 받을 때 HttpURLConnection 객체를 사용할 수 있지만 요청과 응답에 필요한 코드의 양이 많다
그리고 스레드를 사용하면서 넣어야 하는 코드의 양도 많다
핸들러에 대한 이해가 없다면 앱이 비정상 종료될 수도 있다
이런 문제를 해결하기 위해 여러가지 라이브러리들이 만들어졌고, 가장 많이 사용되는 것 중 하나가 Volley이다
Volley 라이브러리는 웹 요청과 응답을 단순화하기 위해 만들어진 라이브러리이다
Volley를 사용하려면 먼저 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(Request Queue)에 넣어주기만 하면 된다
그러면 요청 큐가 알아서 웹 서버에 요청하고 응답까지 받아준다
응답을 받을 수 있도록 지정된 메소드를 만들어두기만 하면 응답이 왔을 때 메소드가 자동으로 호출된다
Volley 라이브러리의 가장 큰 장점은 스레드를 신경 쓰지 않아도 된다는 점이다
요청 큐가 내부에서 스레드를 만들어 웹 서버에 요청하고 응답받는 과정을 진행하는데, 응답을 처리할 수 있는 메소드를 호출할 때는 메인 스레드에서 처리할 수 있도록 만들기 때문이다
따라서 스레드를 사용할 필요도 없고 화면에 결과를 표시할 때 핸들러를 사용할 필요도 없다
build.gradle(Module)에 Volley 라이브러리 추가
dependencies {
...
implementation 'com.android.volley:volley:1.2.1'
}
인터넷을 사용하므로 인터넷 권한 추가와 usesCleartextTraffic 속성을 추가해야 한다
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a57_request">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:usesCleartextTraffic="true"
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/Theme.A57_Request">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="사이트 주소 입력"
android:inputType="textPersonName" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="요청하기" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<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="20sp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
MainActivity
package com.example.a57_request;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
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;
// https://youngest-programming.tistory.com/16
public class MainActivity extends AppCompatActivity {
EditText editText;
TextView textView;
// 요청 큐는 한번만 만들어 계속 사용할 수 있기 때문에 static으로 선언
// 요청 큐는 이 액티비티에서만 사용하는 것이 아니라 앱 전체에서 사용하는 것이 일반적
// 실제 앱을 만들 때는 별도의 클래스를 하나 만들어서 넣어둘 수 있다
static RequestQueue requestQueue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = findViewById(R.id.editText);
textView = findViewById(R.id.textView);
editText.setText("https://yts.am/api/v2/list_movies.json");
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
makeRequest();
}
});
if (requestQueue == null) {
// 요청 큐 생성, 메인 액티비티가 메모리에 만들어질때 같이 생성됨
requestQueue = Volley.newRequestQueue(getApplicationContext());
}
}
public void makeRequest() {
String url = editText.getText().toString();
// StringRequest는 요청 객체 중 하나이며 가장 많이 쓰임
// 요청 객체는 파라미터로 보내는 방식(GET, POST), URL, 응답 성공 리스너, 응답 실패 리스너
// 4개의 파라미터를 전달할 수 있다
// 화면에 결과를 표시할 때 핸들러를 사용하지 않아도 되는 장점이 있다
StringRequest request = new StringRequest(
// com.android.volley.Request
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);
}
}
) {
// POST 방식을 사용하면서 요청 파라미터를 전달하고자 한다면 getParams 메소드에서 반환하는 HashMap 객체에 넣어준다
// 이렇게 만든 요청 객체는 요청 큐에 넣어주는 것만 해주면 된다
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
return params;
}
};
// requestQueue.add(request); 코드로 요청 큐에 request를 add로 넣어줄 때,
// Volley가 내부에서 캐싱을 해준다. 한번 보내고 받은 응답 결과가 있으면, 그 다음에 보냈을 때 이전 것이 있으면 이전 것을 보여줄 수도 있다
// 매번 받은 결과를 새로 보여주려면 setShouldCache를 false로 한다
request.setShouldCache(false);
requestQueue.add(request);
println("요청 보냄");
}
public void println(String data) {
textView.append(data + "\n");
}
}
'안드로이드' 카테고리의 다른 글
영화 정보 가져와 보여주기 (0) | 2021.10.28 |
---|---|
JSON 데이터 다루기 (0) | 2021.10.28 |
웹으로 요청하기 (0) | 2021.10.27 |
소켓 사용하기 (0) | 2021.10.27 |
스레드로 애니메이션 만들기 (0) | 2021.10.27 |