gpt4 book ai didi

java - 重复调用将 Retrofit 网络调用排入队列的静态方法是否会相应地维护传递参数的值?

转载 作者:行者123 更新时间:2023-12-02 09:02:49 27 4
gpt4 key购买 nike

 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**
});
}

我通过从 for 循环调用上述静态方法,使用 Retrofit 顺序将多个 Fe​​edback 类型的对象发送到服务器。

当尝试访问传递的参数(来自回调函数内部的反馈)时,IDE 强制我将传递的参数设为最终参数。

假设:

现在假设每个网络调用都需要1秒才能收到响应。但是,由于我使用 for 循环来调用 sendFeedback 静态方法,因此在 Retrofit 回调方法收到第一个响应之前,它将被调用大约 10 次。

问题:由于在通过 Retrofit 异步调用在其中初始化的线程返回响应之前,该方法将很快结束。这是否意味着回调方法内完成的工作将在 for 循环中最后传递的类型为 Feedback 的参数上完成,或者在 null 上完成,因为该方法无论如何都会在那时结束?

但是,我确信自从显示使用上下文的 toast 以来,至少有一个传递的参数会保留下来!请给我一个解释。

为什么 IDE 强制我将参数作为最终参数?

最佳答案

Java 要求,如果要在匿名类中使用局部变量,则该变量必须是最终变量。基本上,任何时候你的代码看起来像

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

在匿名类中使用的任何局部变量(本例中为 a 和 c)都必须是最终变量。这只是语言的要求。它不会改变代码的工作方式。它仍然会按照您期望的方式运行。

关于java - 重复调用将 Retrofit 网络调用排入队列的静态方法是否会相应地维护传递参数的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60036504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com