Как получить данные из Execute или Enqueue в Retrofit2?
Я новичок в Android и Java разработке, так что не пинайте сильно;)
Суть в чём: нужно проверить валидность токена, который хранится в приложении. Я отправляю токен на сервер и смотрю, какой StatusCode он мне возвращает. Делаю я это через Retrofit2 так:
public class ServerRequester {
private static boolean loginResult;
public static boolean IsValidToken(Context context) {
boolean loginResult = false;
DbContext db = new DbContext(context);
String token = db.GetToken();
Call<TokenCheck> call = Requests.CheckToken("Bearer " + token);
call.enqueue(new Callback<TokenCheck>() {
@Override
public final void onResponse(Call<TokenCheck> call, Response<TokenCheck> response) {
if (response.isSuccessful()) {
Log.e(TAG, "Token check success");
ServerRequester.loginResult = true;
}
else
{
Log.e(TAG, "Token check fail! " + response.code());
}
}
@Override
public final void onFailure(Call<TokenCheck> call, Throwable t) {
Log.e(TAG, "Token check response error! " + t.getMessage());
}
});
return loginResult;
}
}
Но я столкнулся с проблемой, что значение loginResult всегда == false, хоть и метод onResponse выполняется, судя по LogCat. Как я понял, проблема в том, что метод асинхронный. Из чего вытекает вопрос:
Как мне вытащить данные из response, ну или хотя бы получить StatusCode?
Был вариант выполнить запрос синхронно, но андроид бросает ошибку, если сеть крутится в основном потоке (и не зря). Как я понял, нужно поднять отдельный поток. Но то, что я нашёл - создавать отдельный класс и наследоваться от AsyncTask выглядит слишком сложно. Может, есть красивый способ выполнить часть метода (или весь метод) в отдельном потоке и вернуть при этом значение, при этом не создавая новых классов?
Ответы (1 шт):
ход рассуждений - абсолютно верный. проблема в том, что потом асинхронный.
AsyncTask - неплохой выход, если бы он не устарел. так что этот вариант отпадает.
можете посмотреть в сторону RxJava и в целом реактивного программирования, но боюсь это отобьет у вас желание разбираться в программирование))
Вариант №1
создавать Callback'и. т.е. весь ваш call.enqueue сделать как отдельный метод и в качестве аргумента передавать ему то, что должно сделать там, где он вызывается.
подход старый, в инете куча инфы по нему, но и он не идеальный.
Вариант №2
Пересесть на Kotlin и познакомится с Коррутинами и LiveData.
Вы указали метку Android, значит рано или поздно вам придется пересесть на Котлин. А вы уже столкнулись с проблемой, которая в Java решается сложно, а в Kotlin'е просто.