У меня возникли проблемы с выяснением того, как дождаться завершения запроса GET Volley, прежде чем перейти к другой функции.Чтобы проиллюстрировать это, мое приложение использует несколько разных функций, каждая из которых анализирует файл JSON, возвращенный из API, и заполняет эти данные различными классами.Некоторые из этих данных также передаются в другие функции как необходимость для следующего API, и все эти данные затем используются для рисования графика на холсте.Однако, поскольку Volley является асинхронным, когда график рисуется, он либо рисуется неправильно, либо вообще не рисуется, поскольку данные не закончили извлекаться к моменту построения графика.
Возможно ли, например,подождать или приостановить выполнение запроса, прежде чем переходить к другим функциям или рисовать график?Ниже приведена пара функций из моего кода, которые делают то, что я описал выше (вторая функция требует данных из первого API для правильной работы):
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);
}
Я также пробовал это:
public void myApi1(String companyNumber){
String url = "myURL";
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url,null, future, future);
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
queue.add(request);
try{
JSONObject response = future.get();
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);
searchOfficerAppointments(Officer.officerList.get(i).getAppointment());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
Однако я не могу понять, как изменить его, чтобы включить заголовки авторизации, поэтому я не могу проверить, работает ли он.Я понимаю, что есть большая вероятность того, что это дублирующее сообщение, однако я искал его часами и не смог реализовать работающее решение, которое было бы очень полезно.