Назначение значения функции внутри переменной OnViewCreated - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь получить значение JSON из функции и пытаюсь присвоить это значение внутри метода onViewCreated.Код работает нормально, но я не уверен, как присвоить значение внутри переменной onViewCreated.Любая помощь приветствуется.

Основная деятельность

var volleyRequest: RequestQueue?=null
val testlLink="https://www.abc.app"     
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
{
super.onViewCreated(view, savedInstanceState)
volleyRequest=Volley.newRequestQueue(this.context)
getTestData(testlLink)
val data=??????????????????
}

Функция

fun getTestData(Url:String)
{

    val testRequest = StringRequest(Request.Method.GET, Url, Response.Listener {
        response: String ->
        try {
    Log.d("Response:",response)
        }catch (e: JSONException) { e.printStackTrace()}

    },
            Response.ErrorListener {
                error: VolleyError? ->
                try {
                    Log.d("Error:", error.toString())

                }catch (e: JSONException){e.printStackTrace()}
            })
    volleyRequest!!.add(testRequest)
}

1 Ответ

0 голосов
/ 20 декабря 2018

Нельзя присвоить результат запроса переменной, поскольку он выполняется асинхронно.Вместо этого у вас есть несколько вариантов, например coroutines или RxJava , но простым решением может быть просто передать функции обратного вызова, которые будут выполняться после получения ответа.

Пример

lateinit var requestQueue: RequestQueue

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    requestQueue = Volley.newRequestQueue(this)

    getTestData("https://jsonplaceholder.typicode.com/todos/1",
        { body -> Log.d("Network", "Success: $body") },
        { error -> Log.d("Network", "Error", error) }
    )
}

override fun onDestroy() {
    super.onDestroy()
    requestQueue.cancelAll { true }
}

private fun getTestData(url: String, onSuccess: (String) -> Unit, onError: (Throwable) -> Unit) {
    val testRequest =  StringRequest(Request.Method.GET, url,
        Response.Listener { onSuccess(it) },
        Response.ErrorListener { onError(it)}
    )
    requestQueue.add(testRequest)
}

Выход

D/Network: Success: {
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...