Android Studio)[Kotlin] Volley 이용 HTTP 통신

chaeyoung·2023년 1월 20일
0

Android Studio

목록 보기
13/13
post-thumbnail

Volley

  • 안드로이드 앱의 네트워킹을 쉽고 빠르게 하는 HTTP 라이브러리

Volley 이점

  • 네트워크 요청 자동 예약 + 동시 네트워크 예약 가능

  • 표준 HTTP 캐시 일관성을 갖춘 토명한 디스크 및 메모리 응답 캐싱(대규모에 x)

  • UI를 채우기 위해 사용되는 RPC(구조화된 데이터가져오기)유형작업에 탁월

    설정

    • manifest 설정
       dependencies{
           ...
           implementation 'com.android.volley: volley: 1.1.1"
       }

과정

🔧 간단한 요청 보내기

  • RequestQueue를 만들고 Request 객체를 전달하여 Volley를 사용

  • RequestQueue: 네트워크 작업 실행, 캐시 읽고 쓰기, 응답 파싱을 위해 작업자 스레드 관리

    • 인터넷 권한 추가

      • Manifest에 권한 추가:android.permission.INTERNET

    • newRequestQueue 사용

      • RequestQueue를 설정하고 큐를 시작하는 Volley.newRequestQueue 메소드를 제공
        val textView = findViewById<TextView>(R.id.text)
         	...
         
         // RequestQueue 인스턴스객체
         val queue = Volley.newRequestQueue(this)
         val url = "http://google.com"
         
         // 제공된 URL에서 문자열 응답을 요청
         val stringRequest = StringRequest(Request.Method.GET, url,
         	Response.Listener<String>{ response ->
             	textView.text = "Response is: ${response.substring(0,500)}"	
             }, Response.ErrorListener { textView.text = "That didn't work!"})
         
         // RequestQueue에 Request 추가
         queue.add(stringRequest)

    • 요청 보내기

      • 요청 생성후 .add()로 RequestQueue에 추가, 추가 후 요청이 파이프라인 통해 이동해 파싱되어 전달
        • add 호출 -> 캐시처리 스레드 + 네트워크 전달 스레드 풀 진행 -> 큐에 요청을 추가
          • 처리가능: 캐시스레드가 선택 + 분류 작업 진행 -> 파싱된 응답이 기본스레드에 전달
          • 처리 불가능: 네트워크 대기열에 추가 -> 대기열에서 요청을 가져옴
            • HTTP 트랜잭션 실행 -> 작업자 스레드에서 응답을 파싱 -> 기본스레드
    • 요청 취소

      • cancel()호출

        • 실제로 onStop() 메소드에서 대기중인 요청을 취소함
        • onSvaeInstanceState(), getActivity() == null검사
          // 태그 정의하여 요청에 추가
          val TAG = "MyTag"
          val stringRequest: StringRequest
          val requestQueue: RequestQueue?
        
          // request에 태그 설정
          stringRequest.tag = TAG
        
          // reequestQueue에 요청 추가
          requestQueue?.add(stringRequest)
        
          // 이 태그가 포함된 모든 요청을 취소
          protected fun onStop(){
              super.onStop()
              requestQueue?.cancelAll(TAG)
          }

    🔧 RequestQueue 설정

    네트워크 및 캐시 설정

  • RequestQueue가 작업 실행에 필요한 2가지: 요청에 전송할 네트워크, 캐싱을 처리할 캐시

    • DiskBaseCache: 응답당 캐시파일 하나를 메모리 내 색인 제공

    • BasicNetwork: 선호하는 HTTP 클라이언트 기반으로 한 네트워크 전송 제공

      // 캐시 인스터화
      val chache = DiskBaseCache(cacheDir, 1024*1024)
      // HttpURLConnection을 HTTP 클라이언트로 사용하도록 네트워크를 설정
      val network = BasicNetwork(HurlStack())
      
      // 캐시와 네트워크로 RequestQueue를 인스턴스화, 대기열을 시작
      val requestQueue = RequestQueue(cache, network).apply{
      	start()
      }
      
      val url = "http://www.example.com"
      
      // 요청공식화, 응답처리
      val stringRequest = StringRequest(Request.Method.GET, url,
      			Response.Listener<String>{ response -> // 요청 작성 },
                Response.ErrorListener{ error -> // 핸들러에러
      						textView.text = "ERROR: %s".format(error.toString())})
                    
      // RequestQueue에 요청 추가
      requestQueue.add(stringRequest)

싱글톤 패턴 사용

  • 네트워크를 지속적으로 사용하는 경우 RequestQueue의 단일 인스턴스를 설정하는 것이 가장 효율적

    • RequestQueue 및 Volley 기능을 캡슐화하는 싱글톤 제작

    • Activity 컨텍스트가 아닌 Application컨텍스트로 requestQueue를 인스터화

      // 싱글톤 클래스 사용해 RequestQueue 작업 실행하는 예
      // Get
      val queue = MySingleton.getInstance(this.applicationContext).requestQueue
      
      // RequestQueue에 요청 추가
      MySingleton.getInstance(this).addToRequestQueue(stringRequest)

표준 요청 실행

  • Volley에서 지원하는 일반적인 요청 유형

    • StringRequest: URL 지정, 응답으로 원시 문자열 수신
    • JsonObjectRequest, JsonArrayRequest: URL을 지정, 응답따라 JSON객체/배열 가져옴
  • 요청 JSON

    • Volley에서 JSON 요청 클래스 제공

      • JsonArrayRequest: 지정된 URL에 JSONArray의 응답 본문을 가져옴

      • JsonObjectRequest: 지정된 URL에 JSONObject의 응답 본문을 가져오기 위한 요청

        		```kotlin

        var url = "http://my-json-feed"
        val jsonObjectRequest = JsonObjectRequest(Request.Method.GET, url, null,
        Response.Listener { response ->
        textView.text = "Response: %s".format(response.toString())
        }, Response.ErrorListener { error -> / Handler 에러 / }

        // 싱글톤 클래스를 통해 RequestQueue에 액세스
        MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest)

0개의 댓글