在Java中,通过接口调用变量赋值时会延迟

在Java中,通过接口调用变量赋值时会延迟,java,android,function,interface,variable-assignment,Java,Android,Function,Interface,Variable Assignment,对于下面给出的代码,当从接口函数调用字符串receivedResponse时,不会立即赋值。我发现,要在receivedResponse中分配字符串response,我必须再次调用函数oncurrentreponse()。我非常想知道这背后的原因。如果有可能以某种方式解决这个问题,那就更好了。以下代码足以重现错误。请看一看: public class MainActivity extends AppCompatActivity { private NetworkManager networkMa

对于下面给出的代码,当从接口函数调用字符串
receivedResponse
时,不会立即赋值。我发现,要在
receivedResponse
中分配字符串
response
,我必须再次调用函数
oncurrentreponse()
。我非常想知道这背后的原因。如果有可能以某种方式解决这个问题,那就更好了。以下代码足以重现错误。请看一看:

public class MainActivity extends AppCompatActivity {
private NetworkManager networkManager;
String receivedResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    networkManager = new NetworkManager(this);
}

public void handleClick(View view){
    networkManager.getResponseFromNetwork(callback);
    System.out.println("Response in 'receivedResponse' is: " + receivedResponse); // I am getting 
//null value when called for the first time

}
private final NetworkManager.ServiceCallback callback = new NetworkManager.ServiceCallback() {

    @Override
    public void onCurrentResponse(@NonNull String response) {
        receivedResponse = response; // I have to call this function again to assign the response 
 string
        System.out.println("Response in 'response' is: " + response);
    }
};
}

class NetworkManager {
private final RequestQueue queue;
public NetworkManager(@NonNull final Activity activity) {
    queue = Volley.newRequestQueue(activity.getApplicationContext());
}
public interface ServiceCallback {
    @MainThread
    void onCurrentResponse(@NonNull final String response);
}
public void getResponseFromNetwork(final ServiceCallback callback) {
            final String url = "https://www.themealdb.com/api/json/v1/1/random.php";
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            callback::onCurrentResponse, error -> System.out.println("Some error")
    );
    queue.add(stringRequest);
}
}

网络请求是异步的,这意味着您发送请求,并将在将来某个时间在回调中,在您的案例中的
oncurrentrense()
中得到结果
receivedResponse
handleClick()
中将为空,因为网络请求尚未完成,并且将在
onCurrentResponse()
中设置你好,@SergeyGlotov感谢您的回答。那么,如何确保网络请求完成,以便在请求完成后可以更新UI?我遇到的问题是,system.out in onCurrentResponse()在getResponseFromNetwork()中的system.out之前运行,这在本例中是不好的。因此,我需要帮助以确保system.out in onCurrentResponse()在getResponseFromNetwork()之后运行@SergeyGlotov“那么,如何确保网络请求完成,以便在请求完成后更新UI?”您将收到回调“因此,我需要帮助确保system.out in onCurrentResponse()在getResponseFromNetwork()之后运行。”1。你为什么需要它?2.在
getResponseFromNetwork()
中没有
println
,除了在正常情况下不应调用的错误情况