1. Volley 라이브러리
앱에서 서버와 http 통신을 할 때 HttpURLConnection을 사용하면 직접 요청과 응답을 받는 것이 가능하다.
하지만 직접 쓰레드를 구현해야 하며, 기본적인 코드 양 또한 많아 코드가 복잡해진다는 단점이 있다.
그래서 안드로이드에서는 Volley 라이브러리를 제공하고 있다.
Volley 는 안드로이드 애플리케이션에서 HTTP 네트워크 요청을 쉽게 처리할 수 있도록 도와주는 라이브러리다.
Volley는 빠르고 쉬운 네트워크 통신, 캐시 및 부하 분산 등의 기능을 제공한다. 또한 다양한 HTTP 요청 유형 (GET, POST, PUT 등)을 지원하며, 요청 결과를 사용하기 쉬운 형식으로 파싱할 수 있다.
Volley 라이브러리는 다음과 같이 동작한다.
사용자가 Request 객체에 요청 내용을 담아 RequestQueue에 추가하기만 하면,
RequestQueue가 알아서 쓰레드를 생성하여 서버에 요청을 보내고 응답을 받는다.
응답이 오면 RequestQueue에서 Request에 등록된 ResponseListener로 응답을 전달해준다.
따라서 사용자는 별도의 쓰레드 관리 뿐 아니라 UI 접근을 위한 handler 또한 다룰 필요가 없다.
2. Volley 사용 준비
라이브러리를 사용하기 위해서 build.gradle 파일에 dependencies를 추가한다.
dependencies {
implementation 'com.android.volley:volley:1.2.1'
}
manifest에 인터넷 권한을 추가한다.
<uses-permission android:name="android.permission.INTERNET"/>
3. Volley 사용 방법
volley를 사용해서 JSON 데이터를 가져오는 코드를 알아보자.
https://jsonplaceholder.typicode.com/
이 사이트를 이용해 백엔드 서버가 없을 때 임시로 가상 데이터를 만들어 테스트 해 볼 수 있다.
응답받는 데이터가 하나라면 JSONObject 타입, 여러개라면 JSONArray 타입이다.
JsonObjectRequest(JsonArrayRequest) 의 생성자는 5개를 전달해준다.
- http 메소드 요청 방식(get, post 등)
- 요청을 보낼 URL
- 클라이언트에서 전달할 데이터
- response 를 받았을 때 호출 될 메소드 (Response.Listener)
- 에러가 발생했을 때 호출 될 메소드 (Response.ErrorListener)
MainActivity.java 파일
1. JSON Object 를 받는 경우
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
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.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
TextView txtUserId;
TextView txtId;
TextView txtTitle;
TextView txtBody;
final String URL = "https://jsonplaceholder.typicode.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtUserId = findViewById(R.id.txtUserId);
txtId = findViewById(R.id.txtId);
txtTitle = findViewById(R.id.txtTitle);
txtBody = findViewById(R.id.txtBody);
// Volley로 네트워크 통신한다.
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET,
URL + "/posts/1",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("NETWORK_APP", response.toString());
// response에 데이터가 있으니
// 이 데이터를 Parsing 한다.
try {
int userId = response.getInt("userId");
int id = response.getInt("id");
String title = response.getString("title");
String body = response.getString("body");
// 화면에 셋팅
txtUserId.setText(userId+"");
txtId.setText(id+"");
txtTitle.setText(title);
txtBody.setText(body);
} catch (JSONException e) {
// throw new RuntimeException(e);
e.printStackTrace();
Toast.makeText(MainActivity.this, "파싱 에러", Toast.LENGTH_SHORT).show();
return;
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
// 이 코드가 있어야, 네트워크 실행한다.
queue.add(request);
}
}
2. JSON Array를 받는 경우
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
JsonArrayRequest request = new JsonArrayRequest(
Request.Method.GET,
URL + "/posts",
null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.i("NETWORK_APP", response.toString());
// 첫번째 데이터를 화면에 표시
try {
// JSONObject data = response.getJSONObject(0);
//
// int userId = data.getInt("userId");
// int id = data.getInt("id");
// String title = data.getString("title");
// String body = data.getString("body");
int userId = response.getJSONObject(0).getInt("userId");
int id = response.getJSONObject(0).getInt("id");
String title = response.getJSONObject(0).getString("title");
String body = response.getJSONObject(0).getString("body");
// 화면에 셋팅
txtUserId.setText(userId + "");
txtId.setText(id + "");
txtTitle.setText(title);
txtBody.setText(body);
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
// 이 코드가 있어야, 네트워크 실행한다.
queue.add(request);
activity_main.xml 화면
https://jsonplaceholder.typicode.com/posts/1 에서 응답해주는 데이터
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
4. 실행 결과
'Android' 카테고리의 다른 글
Android Studio - RecyclerView의 화면을 갱신하는 방법 (0) | 2023.02.04 |
---|---|
Android Studio - 네트워크로 받은 JSON Array를 RecyclerView로 표시하기 (0) | 2023.02.03 |
Android Studio - 안드로이드 네트워크 통신 권한 설정하기(+에뮬레이터 설정) (0) | 2023.02.03 |
Android Studio - EditText 입력 이벤트 처리 (addTextChangedListener) (0) | 2023.02.03 |
Android Studio - GitHub 연동하기 (0) | 2023.02.03 |