#java #android-studio #exoplayer
Вопрос:
Итак, меня беспокоил этот вопрос. У меня в коде есть значение с именем public String currentSong = "artist- title";
, и я использую его в коде, подобном этому
private MetadataOutput getSongTime() {
return new MetadataOutput() {
@Override
public void onMetadata(Metadata metadata) {
final int length = metadata.length();
if (length > 0) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(existingURL.split("play")[0] "currentsong").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
currentSong = response.body().toString();
}
});
Toast.makeText(RadioService.this, currentSong, Toast.LENGTH_SHORT).show();
}
}
};
}
Но значение в тостах всегда стоит за изменением (при втором запуске оно имеет значение, которое я ожидал при первом запуске).
Есть ли какой-нибудь способ заставить его работать правильно?
Комментарии:
1. Переместите вызов
Toast.makeText()
в режимonResponse()
обратного вызова.2. проблема в том, что тост существует только для проверки значения, мне нужно использовать значение вне функции, и этот способ может сработать
3. В этом случае вам нужно будет понять, как работают асинхронные запросы. Вы не можете использовать асинхронно назначенные значения (из обратного вызова) непосредственно в синхронном коде. Вы задерживаете любое выполнение, для которого требуется это значение, реализуя его или вызывая другие функции из вашего
onResponse()
обработчика.
Ответ №1:
currentSong
получите значение onResponse и его асинхронный
Вы должны дождаться ответа, чтобы отобразить всплывающее сообщение
@Override
public void onResponse(Call call, Response response) throws IOException {
currentSong = response.body().toString();
// you new a new Thread to show info in the screen beacausre the methos is asynchronous
Activity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// show toast here
}
}
}