Android Studio如何等待Volley GET请求和json解析完成

时间:2019-03-18 00:04:44

标签: java json get request android-volley

我在弄清楚如何等待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);
}

但是,我不知道如何更改它以包括授权标头,因此我无法测试它是否有效。我意识到这是重复的帖子的可能性很大,但是我已经搜索了几个小时,还无法实现有效的解决方案,并且会非常感谢您的帮助。

0 个答案:

没有答案