Dowlpack
Dowlpack

Reputation: 318

return value from volley response

Before in other random languages I always returned values from functions and I was so surprised now when I try do like below but got error:

fun getChannels(): List<TblChannel> {
        val stringRequest = JsonObjectRequest(
            Request.Method.GET, "$baseUrl/api/json/channel_list.json",
            null,
            { response ->
                try{
                    val gson = Gson()
                    val token = TypeToken.getParameterized(ArrayList::class.java,TblChannel::class.java).type
                    val channels1:JSONArray = response.getJSONArray("groups").getJSONObject(0).getJSONArray("channels")

                    //got "return isn't allowed here" error
                    return gson.fromJson(channels1.toString(),token)
                } catch (e:Exception){
                    Log.e(tag,"DkPrintError on getChannels: $e")
                }

            },
            { error ->
                Log.e(tag, "DkPrintError on getChannels: $error")
            })


        requestQueue.add(stringRequest)
    }

How can I convert response body to my class and return them?

Upvotes: 0

Views: 513

Answers (2)

Dowlpack
Dowlpack

Reputation: 318

That post will be so helpfull to solve that problem.

In that case I solved the problem with callback method and my code was like below:

fun getChannels(onDataReadyCallback: OnDataReadyCallBack){
        val stringRequest = JsonObjectRequest(
            Request.Method.GET, "$baseUrl/api/json/channel_list.json",
            null,
            { response ->
                try{
                    val gson = Gson()
                    val token = TypeToken.getParameterized(ArrayList::class.java,TblChannel::class.java).type
                    val channels1:JSONArray = response.getJSONArray("groups").getJSONObject(0).getJSONArray("channels")
                    onDataReadyCallback.onDataReady(gson.fromJson(channels1.toString(),token))
                } catch (e:Exception){
                    Log.e(tag,"DkPrintError on getChannels: $e")
                }

            },
            { error ->
                Log.e(tag, "DkPrintError on getChannels: $error")
            })


        requestQueue.add(stringRequest)
    }

and I called that fun like:

private fun getChannels(){
        viewModelScope.launch {
            channelsLiveData.value=roomRepository.getAllChannels
            if (channelsLiveData.value.isNullOrEmpty()){
                remoteRepository.getChannels(object :OnDataReadyCallBack{
                    override fun onDataReady(data: List<TblChannel>) {
                        viewModelScope.launch {
                            channelsLiveData.value=data
                        }
                    }
                })
            }
        }
    }

Upvotes: 0

JustSightseeing
JustSightseeing

Reputation: 3015

This isn't really a kotlin problem, we do have functions that return values, however you cannot return a value from asynch function (which is the case here):

If you perform some calculation asynchronously, you cannot directly return the value, since you don't know if the calculation is finished yet. You could wait it to be finished, but that would make the function synchronous again. Instead, you should work with callbacks

source

what you could do tho (as suggested in the quote), is use callbacks, as shown here

Upvotes: 1

Related Questions