在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
,除了在正常情况下不应调用的错误情况