我正面临一个非常奇怪的问题..我在Volley库的onResponse方法中填充了一个带有String值的arraylist ...在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;
}
任何人都可以解释为什么会发生这种情况?
答案 0 :(得分:1)
根据lordoku和搜索了一下..我发现了一个解决方案..我解决问题的方法是创建一个回调接口并在onResponse完成后执行接口的回调方法getFirmNamesOnSuccess() ...
interface FirmNamesRequestCallback
private interface FirmNamesRequestCallback{
void getFirmNamesOnSuccess(JSONArray firmName);
}
在getFirmNamesToPopulateSpinner(最终的FirmNamesRequestCallback firmNamesRequestCallback)中,以接口作为参数调用 特别是在onResponse内部,执行接口的回调方法
public void onResponse(JSONArray response) {
firmNamesRequestCallback.getFirmNamesOnSuccess(response);
}
使用接口的新对象调用getFirmNamesToPopulateSpinner,并在回调方法的实现中调用,该方法仅在onResponse完成后执行,我填充arrayadapter ...
getFirmNamesToPopulateSpinner(new FirmNamesRequestCallback() {
@Override
public void getFirmNamesOnSuccess(JSONArray firmName) {
//do some stuff here the JSONArray response
}
});