登录按钮需要点击两次才能登录

时间:2021-05-25 17:10:32

标签: android postgresql api android-studio kotlin

我正在 AndroidStudio 上制作应用程序,我需要在他们登录应用程序时验证凭据。该应用程序使用 API 并验证凭据,我在数据库中创建了此函数以检查某人的电子邮件和密码: (postgresql)

create or replace function login (emailf text, passwordf text)
returns boolean
language plpgsql
as
$$
declare pp text;
begin
pp = (select pass_w from utilizador where utilizador.email = emailf);
if (pp = passwordf) then return true;
else return false;
end if; end
$$

我正在通过这个 CheckLoginas 函数解析数据:

var bola: Boolean? = null
fun CheckLoginas(c: Context?, email: String, pass: String): Boolean? {
        var mQueue: RequestQueue
        mQueue = Volley.newRequestQueue(c);
        var url = "https://myurl.com" + "/utilizador/login/" + email + "/" + pass
        val request = JsonArrayRequest(Request.Method.GET, url, null, Response.Listener {
                response ->try {
                var jsonArray = JSONArray()
                jsonArray = response.getJSONArray(0)
                for (i in 0 until jsonArray.length())
                {
                        val jsonObject : JSONObject? = jsonArray.getJSONObject(i)
                        //val user = jsonArray.getJSONObject(i)
                        //val bool = jsonObject.getBoolean("login")
                        val boo : Boolean = jsonObject!!.getBoolean("login")
                        println("im inside CheckLoginas boo $boo\n\n")
                        bola = boo
                }
        } catch (e: JSONException) {
                e.printStackTrace()
        }
        }, Response.ErrorListener { error -> error.printStackTrace() })
        mQueue?.add(request)
        return bola
}

'bola' 变量是一个全局变量,因为我需要从函数中返回一个布尔值,这样我才能知道凭据是否在另一个活动中检查(或不检查)。

问题:

要在凭据正确时登录,我必须在登录按钮中按两次。如果电子邮件和密码正确,我第一次按下它会给我“错误的凭据”错误,第二次它登录。我已经尝试用一段时间()来做到这一点,我一步一步地检查它并看起来很好,似乎没有任何方法可以解决此错误...该功能有效,API 也有效,应用程序本身也有效,它只是有单击按钮两次的错误...这是活动代码:

package com.example.crowdzero

import CheckLoginas
import Database
import android.content.Intent
import android.os.Bundle
import android.view.View.OnFocusChangeListener
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.textfield.TextInputLayout
import java.lang.Thread.sleep

class Login : AppCompatActivity() {

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

        val log_in_btn_log_in = findViewById<Button>(R.id.log_in_btn_log_in)
        val log_in_btn_registar = findViewById<Button>(R.id.log_in_btn_registar)

        log_in_btn_log_in.setOnClickListener {
            verificacao()

        }

        log_in_btn_registar.setOnClickListener {
            val intent = Intent(this, Registo::class.java)
            startActivity(intent)
        }
    }



    private fun verificacao() {

        val log_in_input_text_email = findViewById<TextInputLayout>(R.id.log_in_input_text_email)
        val log_in_input_text_password = findViewById<TextInputLayout>(R.id.log_in_input_text_password)
        val string_email = log_in_input_text_email?.getEditText()?.getText().toString()?.trim()
        val string_password = log_in_input_text_password?.getEditText()?.getText().toString()?.trim()

            if (string_email.isNullOrEmpty())
            {
                log_in_input_text_email.setError(" ")
            }
            else if (string_password.isNullOrEmpty())
            {
                log_in_input_text_password.setError(" ")
            }
            else
            {
                   val email = log_in_input_text_email.editText?.text.toString()
                   val password = log_in_input_text_password.editText?.text.toString()
                   //var baca = CheckLoginas(this,email,password)
                   println(email)
                   println(password)
                   var baca: Boolean? = null
                   baca = CheckLoginas(this, email, password)
                   //baca = CheckLoginas(this,email,password)
                   if (baca == false) {
                       //Toast.makeText(this, "Esta conta não está registada", Toast.LENGTH_SHORT).show();
                       println("Im inside if in login baca $baca")
                   } else if (baca == true) {
                       Toast.makeText(this, email, Toast.LENGTH_SHORT).show();
                       Toast.makeText(this, password, Toast.LENGTH_SHORT).show();
                       val intent = Intent(this, Home::class.java)
                       startActivity(intent)
                       finish()
                   }
            }
    }
}

当我使用数据库中的实际电子邮件和密码进行测试时,baca 变量在应该为真时保持为假,因为 CheckLoginas boo var 为真。这就是导致问题的原因。 image that shows it

我对数据库-API-应用程序还很陌生,所以如果它是一件微不足道的事情,请原谅我

2 个答案:

答案 0 :(得分:0)

您正在呼叫 baca = CheckLoginas(this, email, password) baca 不会立即更新,下一行 if (baca == false) 将在您的 API 响应到达之前执行,因此在您收到一些响应后,baca 变为 true。这就是您需要点击两次的原因。

答案 1 :(得分:0)

已解决:

我几乎在 login.kt 文件中插入了 CheckLoginas 函数。它现在有效!现在看起来像这样:

[^]
相关问题