#java #android #retrofit
Не могу получить данные из onResponse.
public void loadData() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(myurl)
.addConverterFactory(GsonConverterFactory.create())
.build();
RESTPK service = retrofit.create(RESTPK.class);
Call call = service.loadJsonStr();
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
pathPoster = response.body().getPath().get(0).get1(); //переменая которую
мне нужно вытащить
System.out.println(pathPoster);
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
Если в onResponse вывести на экран переменную pathPoster, то она показывает правильный
результат, но если ее вывести на экран после вызова loadData(), то в ней уже ничего
нет и приложение вылетает с ошибкой. Получить данные получил, но пользоваться ими не
получается.
loadData();
System.out.println(pathPoster);
ошибка:
FATAL EXCEPTION: mainjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.awesomedevelop.recyclerview/com.awesomedevelop.recyclerview.MainActivity}:
java.lang.NullPointerException
Ответы
Ответ 1
Потому что у тебя асинхронный запрос. onResponse вызывается после загрузки информации, а System.out.println(pathPoster) вызывается до загрузки, судя по твоему коду. То есть, когда информация еще не успела загрузиться из сети. А падает потому что строка в которую ты не записал еще данные по-умолчанию null. Либо делай синхронный запрос, либо все действия после загрузки выполняй в onResponse. Если переделаешь на синхронный запрос, учти, что синхронные запросы в сеть, нельзя делать в Ui потоке приложения. http://square.github.io/retrofit/2.x/retrofit/Ответ 2
Проще всего работать через Singleton-класс, к которому можно будет обратиться и из UI-потока и из асинхронного ответа
Комментариев нет:
Отправить комментарий