제가 Volley를 사용해 본 적이 없는 관계로 Volley에 해당하는 코드는 생략할게요. 대신 콜백을 사용할 때 일반적인 접근방법을 설명드릴게요. 결론적으로 AsyncTask를 콜백을 이용해 사용해 보신 적이 있다면, 이것과 동일한 패턴을 사용하시면 됩니다. 콜백을 사용하는 Retrofit 같은 경우도 마찬가지이구요. 아주 일반적인 pattern입니다.
// 서버의 API를 호출할 클래스(클래스 이름은 님의 API가 어떤 처리를 하는지 몰라 임의로 주었습니다. 적절한 이름을 사용하시길0
class MyUseCase() {
iinterface Listener {
fun onMyUseCaseFetched(data: MyResponse)
fun onMyUseCaseError(error: VolleyError)
}
private val listeners = hashSetOf<MyUseCase.Listener>()
fun registerListener(listener: MyUseCase.Listener) {
liseteners.add(listener)
}
fun unregiserListener(listener: MyUseCase.Listener) {
liseteners.remove(listener)
}
fun execute() {
val queue = Volley.newRequestQueue(applicationContext)
var url = "https://..."
var req = object: StringRequest(Method.POST, url, Response.Listener{
response ->
handleSuccess(response)
}, Response.ErrorListener{error -> handleError(error) }
){
override fun getParams(): Map<String, String>{
val params: MutableMap<String, String> = HashMap()
params["sql"] = sql문..
return params
}
}
queue.add(req)
}
privae fun handleSuccess(response: MyResponse) {
for (listener : listeners) {
listener.onMyUseCaseFetched(response)
}
}
privte fun handleError(error: VolleyError) {
for (listener : listeners) {
listener.onMyUseCaseError(error)
}
}
}
class MainActivity : AppCompatActivity(), MyUseCase.Linstener {
private val myUseCase by lazy { MyUseCase() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
public void onStart() {
super.onStart()
myUseCase.registerListener(this)
fetchData()
}
public void onStop(...) {
super.onStop(..)
myUseCase.unregisterListener(this)
}
private fun fetchData() {
myUseCase.execute()
}
override fun onMyUseCaseFetched(data: MyResponse) {
// TODO : 여기에 원하는 처리를 하세요.
}
override fun onMyUseCaseError(error: VolleyError) {
// TODO : 에러 처리
}
}
API 호출 후의 처리는 콜백 안에서 하셔야 합니다. 서버 API를 비동기로 호출할 때의 처리는 대체로 위와 같이 동일합니다. 그리고 Volley 자체가 이미 백그라운드 쓰레드 처리와 메인쓰레드로의 전환을 구현해놓은 상태이기 때문에 님이 중복적으로 쓰레드를 다시 생성하려 하시는 것은 오버킬이라고 생각됩니다.