在Volley onResponse回调方法中填充后,arraylist为空



我面临一个非常奇怪的问题。。我在Volley库的onResponse方法中用String值填充数组列表。。。在onResponse中记录arraylist的值表明arraylist不是空的。。。但是当我在arraylist从方法中重新返回之前做同样的操作时,方法是空的。。。

private ArrayList<String> getFirmNamesToPopulateSpinner() {
        JsonArrayRequest jsonArrayFirmNamesRequest = new JsonArrayRequest(Request.Method.POST, AppConfig.URL_FIRMNAMES,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        for(int i=0; i<response.length(); i++){
                            try {
                                JSONObject firmObject = response.getJSONObject(i);
                                String firmName = firmObject.getString(AppConfig.TAG_FIRM_NAME);
                                firmNamesArrayList.add(firmName);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        Log.d(debugTag, "return inside onResponse" + firmNamesArrayList);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e(debugTag, "response error: " + error.getMessage());
                    }
                });
        Log.d(debugTag, "return before adding Request" + firmNamesArrayList);
        // Adding request to request queue
        VolleySingleton.getInstance().addToRequestQueue(jsonArrayFirmNamesRequest, AppConfig.TAG_FIRMNAMES_REQUEST);
        return firmNamesArrayList;
    }

有人能解释为什么会发生这种事吗?

根据lordoku并在搜索一点之后。。我找到了一个解决办法。。我解决这个问题的方法是创建一个回调接口,并在onResponse完成后执行接口的回调方法getFirmNamesOnSuccess()。。。

接口FirmNamesRequest回调

private interface FirmNamesRequestCallback{
    void getFirmNamesOnSuccess(JSONArray firmName);
}

在以接口为参数调用的getFirmNamesToPopulatePinner(最终FirmNamesRequestCallback firmNamesRequest Callback)内部特别是在onResponse中,接口的回调方法被执行

 public void onResponse(JSONArray response) {
                    firmNamesRequestCallback.getFirmNamesOnSuccess(response);
                }

getFirmNamesToPopulatePinner是用接口的一个新对象调用的,在回调方法的实现中,只有在onResponse完成后才能执行,我填充arrayadapter。。。

 getFirmNamesToPopulateSpinner(new FirmNamesRequestCallback() {
                @Override
                public void getFirmNamesOnSuccess(JSONArray firmName) {
                    //do some stuff here the JSONArray response
                }
            });

最新更新