때찌
20
2021-05-05 02:20:32
0
39

volley 요청 후 응답대기와 관련하여 질문있습니다.


안녕하세요


현재 안드로이드에서 volley요청에 대한 응답을 받고 / 그 응답받은 데이터를 처리하려고 합니다.


1. volley요청을 하고

2. 서브 스레드를 생성해서 응답여부를 검사합니다

3. Response.Listener에서 응답을 받으면 flag를 true로 바꿉니다

4. 서브스레드는 flag를 확인하면 종료됩니다

5. 메인스레드는 join되고 그 후의 코드를 진행하려고 합니다.

6. 일주일째 헤매고 있습니다.. ㅠㅠ



------------------------------------------------


class MainActivity : AppCompatActivity() {

var flag = false //응답여부 확인하는 플래그

override fun onCreate(savedInstanceState: Bundle?) {

...


//volley요청 코드

val queue = Volley.newRequestQueue(applicationContext)

var url = "https://..."

var req = object: StringRequest(Method.POST, url, Response.Listener{

response -> Log.d(1번) //여기가 먼저 실행돼야 함

}, Response.ErrorListener{error... }

){

override fun getParams(): Map<String, String>{

val params: MutableMap<String, String> = HashMap()

params["sql"] = sql문..

return params

}

}

queue.add(req)

}


//응답여부 확인할 서브 스레드

var t = thread()

t.start()

t.join()


//Log.d(이후실행) //여기가 후에 실행돼야 함


//서브스레드

inner class thread: Thread() {

override fun run() {

while(true){

Thread.sleep(100)

if (flag == true)

break

}

}



제가 확인한 문제점은

-volley는 응답을 메인스레드에 전달함

-메인스레드는 join상태로 대기상태이므로 저 응답을 받지 못함

-응답을 받지 못하니까 flag가 변경이 안되고 서브스레드는 종료되지 않음

-서브스레드가 종료되지 않으니 메인은 join에서 계속 걸렸있음...



대안으로 volley의 동기식 요청으로 해보았으나 동기식요청은 asyncTask에서 하지 않으면 응답을 받지 못하는듯합니다.

그런데 asyncTask에서 실행하면 비동기식이라 메인스레드의 다음코드가 먼저 실행되어 버립니다


Response.Listener부분에서 다음코드 진행하는 방법도 있으나 그 후에 진행해야 할 코드의 양이 많고, 또 다시 volley를 요청해야하는 등의 이유로 코드 진행은 메인스레드에서 순차적으로 되어야 합니다... 즉 응답 후 코드흐름이 다시 메인스레드로 넘어와야합니다..


다른사이트에서 조언해주신 방법은 콜백을 구현해서 콜백을 받는 쪽에서 처리하라는 거였는데, 콜백을 처리하는 함수에서 처리하는 것 또한 Response.Listener에서 처리하는 방법과 같은 문제가 생길듯합니다.


응답받을때까지 코드진행을 멈추고 응답받으면 다시 진행하면 되는데.. 구현하는 방법을 모르겠습니다.


조언 부탁드립니다 ㅠㅠ




0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.