我面临一个非常奇怪的问题。。我在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
}
});