我在弄清楚如何等待Volley GET请求完成后再转到其他功能时遇到了一些麻烦。为了说明这一点,我的应用程序利用了几个不同的函数,每个函数都解析从API返回的JSON文件,并使用该数据填充不同的类。这些数据中的一些也作为下一个API的必要性传递到其他函数中,然后将所有这些数据用于在画布上绘制图形。但是,由于Volley是异步的,绘制图形时它要么绘制不正确,要么根本没有绘制,因为到绘制图形时数据还没有完成提取。
例如,是否可以等待或暂停直到请求完成,然后再移至其他功能或绘制图形?以下是我的代码中执行上述操作的几个函数(第二个函数需要第一个api的数据才能正常工作):
api_key
我也尝试过这个:
public void searchApi1(String companyNumber){
String url = "myURL";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray array = response.getJSONArray(("items"));
for (int i = 0; i < array.length();i++){
JSONObject o = array.getJSONObject(i);
String appointment = o.getString("links");
String parsedAppointment = parseApp(appointment);
Officer officer = new Officer(o.getString("name"), o.getString("officer_role"), parsedAppointment);
Officer.officerList.add(officer);
searchApi2(parsedAppointment);
}
} catch (JSONException e) {
Log.d("tag3", response.toString());
e.printStackTrace();
}
}
}, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "myKey");
return headers;
}
};
queue.add(request);
createGraph();
}
public void searchApi2(String officerID){
String url = "myUrl2";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
List<OfficerAppointments> tempList = new ArrayList<>();
JSONArray array = response.getJSONArray(("items"));
for (int i = 0; i < array.length();i++){
JSONObject o = array.getJSONObject(i);
String companyName = o.getString("appointed_to");
String parsedName = parseCompanyName(companyName);
OfficerAppointments appointment = new OfficerAppointments(o.getString("name"),parsedName, o.getString("officer_role"));
tempList.add(appointment);
}
OfficerAppointments.appointmentList.add(tempList);
} catch (JSONException e) {
Log.d("tag5", e.toString());
e.printStackTrace();
}
}
}, new com.android.volley.Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("tag6", error.toString());
error.printStackTrace();
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Authorization", "myKey");
return headers;
}
};
queue.add(request);
}
但是,我不知道如何更改它以包括授权标头,因此我无法测试它是否有效。我意识到这是重复的帖子的可能性很大,但是我已经搜索了几个小时,还无法实现有效的解决方案,并且会非常感谢您的帮助。