Android Studio, как ждать окончания запроса GET Volley и разбора json - PullRequest
0 голосов
/ 18 марта 2019

У меня возникли проблемы с выяснением того, как дождаться завершения запроса 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();
    }
}

Однако я не могу понять, как изменить его, чтобы включить заголовки авторизации, поэтому я не могу проверить, работает ли он.Я понимаю, что есть большая вероятность того, что это дублирующее сообщение, однако я искал его часами и не смог реализовать работающее решение, которое было бы очень полезно.

...