Почему значение присваивается после использования в методе?

#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
        }
    }
}