Как отозвать значение из функции Volley On Response в Котлине - PullRequest
0 голосов
/ 13 июня 2019

Я интегрирую систему входа в систему, для которой я хочу, чтобы функции Response.Listener и Response.ErrorListener возвращали логическое значение.

Я искал в Google и обнаружил, что это можно сделать с помощью интерфейса обратного вызова ( Этот вопрос ). Но я не знаю, как это сделать в Котлине

[ТАКЖЕ ОБНОВЛЕНО] Это мой файл Kotlin, содержащий мои функции, которые используются во многих действиях:

package com.pratham.example
// My required imports
import ...  

fun function1(){
...
}
fun function2(){
...
}

// This Auth function will return True if login success

fun auth(activity:Activity):Boolean{
 val queue = Volley.newRequestQueue(activity)
            val req = JsonObjectRequest(Request.Method.POST, url, jsonObj,
                Response.Listener { response ->
                    val JSONObj = response.getString("Status")
                    if(JSONObj=="200"){
                        // return true 
                    }
                    else{
                        // return false 
                    }
                }, Response.ErrorListener {
                    // return  false 
                }
            )
            queue.add(req)
}

fun function4(){
...
}

Эта функция будет возвращать true или false в соответствии с реакцией залпа. Как я могу вернуть значение из Response.Listener и Response.ErrorListener в Kotlin

Редактировать :: Я пытался использовать такой интерфейс

package com.pratham.sitapuriya

import ...

fun function1(){
...
}
fun function2(){
...
}

interface MyInterface {
    fun onCallback(response: Boolean,context:Context)
}

class Login : MyInterface {
    private val myInterface = this

    override fun onCallback(response: Boolean,context:Context) {
        Toast.makeText(context,"Working",Toast.LENGTH_SHORT).show()
    }

    fun auth(activity: Activity): Boolean {

        val sp1 = activity.getSharedPreferences("Login", AppCompatActivity.MODE_PRIVATE)
        if (sp1.contains("token") && sp1.contains("deviceId")) {
            val token = sp1.getString("token", null)
            val deviceId = sp1.getString("deviceId", null)
            if (!token.isNullOrEmpty() && !deviceId.isNullOrEmpty()) {
                //  val url = "http://10.0.2.2:80/Projects/Sitapuriya/login.php"
                val url = activity.getString(R.string.server) + "/tokenAuth.php"
                val params = HashMap<String, String>()
                params["token"] = token
                params["deviceId"] = deviceId
                val jsonObj = JSONObject(params)
                val queue = Volley.newRequestQueue(activity)
                val req = JsonObjectRequest(Request.Method.POST, url, jsonObj,
                    Response.Listener { response ->
                        val JSONObj = response.getString("Status")
                        if (JSONObj == "200") {
                            // return true
                            myInterface.onCallback(true,activity)
                        } else {
                            // return false
                            myInterface.onCallback(false,activity)
                        }
                    }, Response.ErrorListener {
                        // return  false
                        myInterface.onCallback(false,activity)
                    }
                )
                queue.add(req)


            } else {
                return false
            }

        } else {
            return false
        }

        return false
    }
}

fun function4(){
...
}

Но теперь я понятия не имею, как обратный вызов будет возвращать значение в функции auth (), а также как я буду вызывать эту функцию auth () в других моих действиях.

Пожалуйста, помогите Я никогда не использовал обратный вызов раньше ..

1 Ответ

1 голос
/ 13 июня 2019

Вы не можете, код, который вы выполняете, выполняется асинхронно, поэтому вы не можете иметь оператор return там. Но это не значит, что вы не можете получить значение. Самый простой вариант - создать LiveData<Boolean> и наблюдать за ним в своей деятельности. Когда значение изменится, вы получите уведомление.

Следующее, что вы можете сделать, - это создать интерфейс.

interface MyCallback{
    fun onValueChanged()
}

Затем реализуйте этот интерфейс в своей деятельности и переопределите метод. Затем вы можете использовать его для получения обратного вызова после завершения асинхронного вызова. Посмотрите код ниже.

interface MyInterface{
    fun onCallback(response:Boolean)
}

class LoginActivity : AppCompatActivity(), AuthListener, MyInterface {

    val myInterface = this

    override fun onCallback(response: Boolean) {

    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val queue = Volley.newRequestQueue(activity)
        val req = JsonObjectRequest(Request.Method.POST, url, jsonObj,
            Response.Listener { response ->
                val JSONObj = response.getString("Status")
                if(JSONObj=="200"){
                    //return true
                    myInterface.onCallback(true)
                }
                else{
                    myInterface.onCallback(false)
                }
            }, Response.ErrorListener {
                // return  false 
            }
        )
        queue.add(req)

    }
}

Надеюсь, это поможет. Спасибо :)

...