Поддерживает ли повторный вызов метода stati c, который ставит в очередь сетевой вызов Retrofit, значение передаваемых аргументов соответственно? - PullRequest
0 голосов
/ 03 февраля 2020
 public static void sendFeedback(final Feedback feedback, final Context context) {
    Call<MyServerResponse> sendFeedbackCall = service.sendFeedback(feedback);

    sendFeedbackCall.enqueue(new Callback<MyServerResponse>() {
        @Override
        public void onResponse(@NonNull Call<MyServerResponse> call, @NonNull Response<MyServerResponse> response) {
            if (response.isSuccessful()) {
                feedback.setSent(true); // *do more actions on **that feedback object** based on the response body.*
            } else {
             feedback.setSent(false); // *do more actions on **that feedback object** based on the response body.*
            }
        }

        @Override
        public void onFailure(@NonNull Call<MyServerResponse> call, @NonNull Throwable t) {
          feedback.setSent(false); // do more actions on **that feedback object** based on the response object.
          Toast.makeText(context,"Hello",Toast.LENGTH_SHORT).show(); // use the passed argument **context**
    });
}

Я отправляю несколько объектов типа Feedback на сервер последовательно, используя Retrofit, вызывая вышеуказанный метод stati c из a для l oop.

При попытке получить доступ к переданному аргументу что является обратной связью внутри функции обратного вызова, IDE заставила меня сделать переданные аргументы окончательными.

Предположение:

Теперь Предположим, каждый сетевой вызов займет, скажем, 1 секунду, пока я не получу ответ. Но, поскольку я использую для l oop для вызова метода staf c sendFeedback, он будет вызываться примерно 10 раз, прежде чем первый ответ будет получен методами обратного вызова Retrofit.

Вопрос : Поскольку метод завершится в любом случае слишком рано, прежде чем поток, инициализированный внутри него с помощью Retrofit asyn c call, возвратит ответ. Означает ли это, что работа, выполняемая внутри методов обратного вызова, будет выполняться с последним переданным аргументом типа Feedback из for для l oop или с нулевым значением, поскольку метод все равно закончился бы к тому времени?

Но я уверен, что хотя бы один переданный аргумент выживет, поскольку показан тост, использующий контекст! Пожалуйста, дайте мне объяснение.

И почему IDE заставляет меня сделать аргументы окончательными?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Java требует, чтобы, если вы собираетесь использовать локальную переменную в анонимном классе, она была конечной. По сути, всякий раз, когда у вас есть код, который выглядит как

void myMethod(A a, B b) {
    C c = new C();
    doSomething(new MyClass() {
        void methodInAnonymmousClass() {
             a.doSomething();
             c.doSomething();
        }
    });
}

Любые локальные переменные, которые вы используете внутри анонимного класса (в данном случае a и c), должны быть окончательными. Это просто требование языка. Это не изменит ничего о том, как работает ваш код. Он будет вести себя так, как вы ожидаете.

0 голосов
/ 03 февраля 2020

Первый: Чтобы получить доступ к любой переменной внутри анонимного класса, созданного внутри метода, эта переменная должна быть конечной. Больше нет необходимости явно писать последнее ключевое слово начиная с Java 8, но переменная не должна изменяться внутри метода. Итак, после того, как все final применяется неявно для вас.

Second: Эта переменная копируется в анонимный класс каждый раз, когда метод вызывается для использования созданными анонимными классами. Вот почему, если вы запустите поток, у него все еще будут переменные для работы, даже если к тому времени область метода закончилась, а параметры метода больше не существуют. См. Приведенный ниже код:

for(int i =0; i<10,i++){
    show(i);
 }

void show(final int param) {
    new Thread(new Runnable() {
        public void run() {
                try {
                    wait(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            System.out.print(param);
        }
    }).start();
}

Приведенный выше код будет напечатан: 12345678910

Та же концепция применима к вопросу, где анонимный класс представляет собой Retrofit Callback.

...