Изменение элементов UI в потоке ответа Retrofit

134
12 февраля 2018, 04:12

Задача: Юзер в 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) {
            }
        });
    }
    }

}
Answer 1

У вас скорее всего в сетевом запросе происходит ошибка, вызывается метод onFailure(), т.к. там пусто, ничего не происходит. Всегда обрабатывайте ошибки, а не игнорируйте их.

READ ALSO
Наполнения массива java из методов

Наполнения массива java из методов

Имеется три метода, которые в результате своей работы возвращают массивы типа doubleЗаполнение массива данными из одного метода выглядит у меня...

153
Считывание файлов из других каталогов в Java

Считывание файлов из других каталогов в Java

Пишу web-сервер на JavaНужно считать и послать файл, который находится в другом каталоге

145
Передача простых типов по ссылке

Передача простых типов по ссылке

Как предавать переменные простых типов в методы, если нам необходимо изменить искомое значениеКлассы обёртки не помогают, т

142