JsonRequest задерживается

У меня есть функция jsonRequest, которую я буду использовать для входа в систему. Функция изменит логическое значение (именованный флаг) независимо от того, есть ли успешный запрос или нет. Я вызываю функцию для функции tryLogin, которая находится внутри Button OnClickListener.

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

Кто-нибудь знает, как это исправить ? Код выложу ниже. Спасибо :)

Функция jsonRequest (не может опубликовать URL-адрес, но работает):

public void jsonRequest()  {

    StringRequest postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                           // response
                     Log.d("Response", response);
                    if (response.equals("success")) {
                        flag = true;
                        Log.d ("flag2", String.valueOf(flag));
                    }
                    else {
                        flag = false;
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", String.valueOf(error));
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<String, String>();
            params.put("email", mEmailView.getText().toString());
            params.put("pass", mPasswordView.getText().toString());

            return params;
        }
    };
    queue.add(postRequest);
}

Здесь я вызываю jsonRequest и логическую проверку.

if ( ! password.isEmpty() && ! email.isEmpty()) {

        jsonRequest();


        Log.e("FLAG", String.valueOf(flag));

        if (flag == true) {
            cancel = false;
        }
        else {
            cancel = true;
            mPasswordView.setText("");
            focusView = mEmailView;
            Toast.makeText(getApplicationContext(), "Invalid email or password", Toast.LENGTH_SHORT).show();
        }

каково значение флага по умолчанию?

nimi0112 31.07.2018 11:19

Значение по умолчанию неверно.

bravevctr 31.07.2018 11:21

Это потому, что ваш метод jsonRequest () выполняется в другом потоке. Пока не будет выполнен вызов вашего метода. Настройте метод на onResponse вашего запроса.

Punit Sharma 31.07.2018 11:22

Volley генерирует асинхронный запрос, поэтому код после jsonRequest(); выполняется до того, как вы получите ответ. Вы должны переместить эту логику в onResponse.

LS_ 31.07.2018 11:22

Я тоже пробовал это (ответ Ганеша Тиконе ниже), и он может изменить флаг на false. Но после этого вход в систему все равно происходит, поскольку флаг верен. Также отображается тост "неверный пароль".

bravevctr 31.07.2018 11:47

@bravevctr ты попробовал мой ответ?

nimi0112 31.07.2018 12:29
0
6
48
2

Ответы 2

Ваш if condition всегда является false, потому что вы не обновляете присвоенное ему значение по умолчанию, то есть flag - это false.

Попробуй это

if ( !( password.isEmpty() &&  email.isEmpty())) {

            jsonRequest();

            Log.e("FLAG", String.valueOf(flag));

            cancel = false;
            }
            else {
            cancel = true;
           // mPasswordView.setText("");
            focusView = mEmailView;
            Toast.makeText(getApplicationContext(), "Please enter email and password", Toast.LENGTH_SHORT).show();
            }
            }

и в jsonRequest ();

public void jsonRequest()  {

    StringRequest postRequest = new StringRequest(Request.Method.POST, url,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                           // response
                     Log.d("Response", response);
                    if (response.equals("success")) {
                        flag = true;
                        Log.d ("flag2", String.valueOf(flag));
                    }
                    else {
                        flag = false;
Toast.makeText(getApplicationContext(), "Invalid email or password", Toast.LENGTH_SHORT).show();
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", String.valueOf(error));
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<String, String>();
            params.put("email", mEmailView.getText().toString());
            params.put("pass", mPasswordView.getText().toString());

            return params;
        }
    };
    queue.add(postRequest);
}

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

 public void jsonRequest()  {

  StringRequest postRequest = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response) {
                       // response
                 Log.d("Response", response);
                if (response.equals("success")) {
                    flag = true;
                    Log.d ("flag2", String.valueOf(flag));
                    cancel = false;      

                }
                else {
                    flag = false;
                    cancel = true;
                    mPasswordView.setText("");  
                    focusView = mEmailView;   
                    Toast.makeText(getApplicationContext(), "Invalid email or password", Toast.LENGTH_SHORT).show();         
                }
            }
        },
        new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                // error
                Log.d("Error.Response", String.valueOf(error));
                //TODO: Please handle error scenario, which is missing.    
            }
        }
  ) {
    @Override
    protected Map<String, String> getParams()
    {
        Map<String, String>  params = new HashMap<String, String>();
        params.put("email", mEmailView.getText().toString());
        params.put("pass", mPasswordView.getText().toString());

        return params;
    }
};
queue.add(postRequest); 
}

Я пробовал это, и он может изменить флаг на false. Но после этого вход в систему все равно происходит, поскольку флаг верен. Также отображается тост "неверный пароль".

bravevctr 31.07.2018 11:46

Ваша логика входа должна зависеть от флага OnResponse. Поскольку ваш код был частичным, я не могу его понять.

Ganesh Tikone 31.07.2018 13:19

Другие вопросы по теме