kotlin Android volley 구현
카테고리: kotlin
1. 안드로이드 백엔드 및 TCP 통신 사용하기
예전에 안드로이드 초창기에는 java의 Socket
통한 TCP 통신 HttpURLConnection
등을 직접 사용이 가능했다.
그러다 어느날 갑자기 네트워크의 통신은 Activity에서는 사용을 허용하지 않았고 런타임에서 에러가 났다.
응답이 없을 경우 화면이 멈추고 타임아웃시간까지 무한 대기가 발생했기 때문이다.
그 때 이후 Thread
나 Service
에서 통신을 구현해야 했다. 지금도 이방식은 사용이 가능하지만 권장하는 방식은 아니다.
대용량 파일 전송을 위해서는 아직도 FTP, TCP 소켓을 이용해야 하지만 단순 텍스트정보, API 데이터 등은 구글에서 HTTP 통신을 위한 라이브러리를 제공한다.
참조 : https://developer.android.com/training/volley github : https://google.github.io/volley/
github의 유저가 개발한 volley는 사용이 편리한 HTTP 통신 라이브러리였다. 의존성을 추가해서 사용이 가능했었는데 Android에서 정식 채택되면서 가이드 문서도 작성이 되었다.
이번에 이 Volley를 사용해서 통신을 진행하고자 한다.
라이브러리 적용
dependencies {
...
implementation 'com.android.volley:volley:1.2.1'
}
안드로이드 스튜디오 4.0 기준으로 작성되었으며 차후 변경이 있을수도 있다.
의존성을 추가하고 sync를 클릭하여 의존성을 해결한다.
권한 설정
기본적으로 Volley는 Http 통신이다. 인터넷 권한이 필요하다.
<manifest
...>
<uses-permission android:name="android.permission.INTERNET"/>
...
</manifest>
안드로이드 정책상 민감한 특수 권한의 경우 런타임에서 사용자에게 고지하고 직접 권한을 받아야한다.
그러나 인터넷의 경우 특수 권한이 아니기때문에 manifest에 등록만 하면된다.
특수권한 참조 : https://developer.android.com/training/permissions/requesting-special?hl=ko
http 통신 설정
<application
...
android:usesCleartextTraffic="true"
...
</application>
안드로이드는 보안 이슈로 https 통신을 권장하며, http 통신을 위해서는 설정을 추가해야한다.
Volley의 이해
Volley 처리과정
- RequestQueue를 생성한다.
- Request를 생성하고 url, 통신타입, 데이터, 응답 리스너, 에러 리스너를 지정한다.
- RequestQueue네 add()로 Request를 추가한다.
- Volley는 Request를 cache thread 추가한다.
- 내부적인 스케쥴링 방식에 의해 하나씩 선택되어 network thread가 생성되어 실행된다.
- 처리 결과를 읽고 파싱하여 다시 main thread에서 등록한 리스너를 통해 전달한다.
1,2,3은 메인 쓰레드 즉 Activity, Service 등 Context에서 바로 처리가 가능하다.
4,5는 cache thread 에서 처리된다.
6은 각 request 단위로 network thread가 생성 되어 데이터를 주고 받는다.
결과는 main thread에서 등록한 콜백 함수를 통해 전달된다.
따로 thread 구현 할 필요없이 url, 전송데이터, 응답데이터만 있으면 된다.
2. 코드 구현
kotlin code
// 전역 변수를 선언한다.
companion object{
var requestQueue: RequestQueue?=null //여기!
}
override fun onCreate(savedInstanceState: Bundle?) {
...
// 라이프 사이클 상 데이터 통신 전 context로 requestQueue 객체를 생성한다.
requestQueue= Volley.newRequestQueue(applicationContext)
...
}
fun volleySend() {
var url = "http://localhost:8080/login"
var sendData = JSONObject()
sendData.put("userId","test");
val request = JsonObjectRequest(
Request.Method.POST, // 전송 방식
url, // url 주소
sendData, // 전송 데이터
Response.Listener{ response ->
//정상 응답값 처리 (상태코드 200, 201, 202 등)
}, Response.ErrorListener {
// 에러 응답값 처리 (상태코드 400, 404, 500 등)
// 서버 에러 메세지를 받아서 문자열로 저장
var body = String(it.networkResponse.data, Charsets.UTF_8)
}
)
requestQueue?.add(request)
단계별로 보면
requestQueue
변수 선언requestQueue
객체 생성- volley 처리를 위한 데이터 생성과
request
생성이다.- 이번의 경우 데이터타입이
application/json
타입이라서JsonObjectRequest
로 생성하였다. - request는
StringRequest
,JsonRequest
,ImageRequest
등 다양한 request를 지원한다. - Request 타입에 따라 전달되는 데이터가 달라진다.
- Listener로 정상처리, 에러처리 2가지 타입에 따라 처리가 가능하다.
- 변수명을 적고 람다식으로 할수도 있고, 생략시 변수명은
it
가 된다.
- 이번의 경우 데이터타입이
- request가 만들어 졌으면
requestQueue
에 add만 하면 된다.- 내부적으로 스케쥴러에 의해 쓰레드가 생성 처리되고 결과는 Listener로 호출된다.
개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
댓글 또는 메일로 알려주시면 감사하겠습니다.
댓글 남기기