Задача: Юзер в Activity вводит свой email и нажимает кнопку. При нажатии с помощью Retrofit делается запрос на сервер, который высылает на email юзера пароль и выдаёт ответ типа "ок"(сам ответ не важен, для клиента важен код 200). Если пароль отправлен, нужно изменить текст в textView, сделать доступным поле для ввода пароля и поменять текст на кнопке.
Проблема: из потока Callback не меняются элементы UI. Пробовал runOnUiThread
, но всё равно в случае успеха не работает. onResponse() в случае успеха тоже не выдает каких-либо уведомлений Toast. Хотелось бы узнать, что не так.
Код:
public class AuthActivity extends AppCompatActivity implements
View.OnClickListener {
TextView email;
TextView password;
Button button;
TextView textView;
private static final String URL = "http://localhost/";
private static IWHApi apiService = ServiceGenerator.createService(IWHApi.class, URL);
private SharedPreferences mSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auth);
this.setTitle("Вход в систему");
mSettings = getSharedPreferences("USER", Context.MODE_PRIVATE);
email = (TextView) findViewById(R.id.email);
password = (TextView) findViewById(R.id.password);
button = (Button) findViewById(R.id.button);
textView = (TextView) findViewById(R.id.textView);
password.setEnabled(false);
button.setOnClickListener(this);
}
public void onClick(final View v){
APIClient.getClient().create(IWHApi.class);
//пароль пустой, нужно запросить
if(password.getText().toString().isEmpty()){
Call<String> call = apiService.getPassword(email.getText().toString());
//Обрабатываем ответ от сервера на запрос
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
//код ответа сервера (200 - ОК)
int statusCode = response.code();
switch (statusCode) {
case 400:
Toast.makeText(v.getContext(), "Email не заполнен", Toast.LENGTH_LONG).show();
break;
case 404:
Toast.makeText(v.getContext(), "Пользователь с таким email не найден", Toast.LENGTH_LONG).show();
break;
case 500:
Toast.makeText(v.getContext(), "Ошибка сервера", Toast.LENGTH_LONG).show();
break;
case 200:
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("На ваш email " + email.getText().toString() + " был выслан одноразовый пароль для входа. Пожалуйста, введите его в поле ниже\n Если пароль не пришел, запросите его еще раз");
password.setEnabled(true);
button.setText("Войти");
}
}
);
break;
default:
Toast.makeText(v.getContext(), "Неизвестная ошибка", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
}
}
}
У вас скорее всего в сетевом запросе происходит ошибка, вызывается метод onFailure(), т.к. там пусто, ничего не происходит. Всегда обрабатывайте ошибки, а не игнорируйте их.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Имеется три метода, которые в результате своей работы возвращают массивы типа doubleЗаполнение массива данными из одного метода выглядит у меня...
Пишу web-сервер на JavaНужно считать и послать файл, который находится в другом каталоге
Как предавать переменные простых типов в методы, если нам необходимо изменить искомое значениеКлассы обёртки не помогают, т