У меня есть функция 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();
}
Значение по умолчанию неверно.
Это потому, что ваш метод jsonRequest () выполняется в другом потоке. Пока не будет выполнен вызов вашего метода. Настройте метод на onResponse вашего запроса.
Volley генерирует асинхронный запрос, поэтому код после jsonRequest(); выполняется до того, как вы получите ответ. Вы должны переместить эту логику в onResponse.
Я тоже пробовал это (ответ Ганеша Тиконе ниже), и он может изменить флаг на false. Но после этого вход в систему все равно происходит, поскольку флаг верен. Также отображается тост "неверный пароль".
@bravevctr ты попробовал мой ответ?
Ваш 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. Но после этого вход в систему все равно происходит, поскольку флаг верен. Также отображается тост "неверный пароль".
Ваша логика входа должна зависеть от флага OnResponse. Поскольку ваш код был частичным, я не могу его понять.
каково значение флага по умолчанию?