2015-11-03 51 views
0

我面临一个很奇怪的issue..i内后空填充在排球库onResponse方法字符串值一个ArrayList ...登录内部onResponse ArrayList中的值是显示的ArrayList是不是空的......但是当我做同样的ArrayList中从方法reuturned之前是空的...数组列表被填充凌空onResponse回调方法

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以及搜索bit..i后

+1

的原因是onResonse是一个回调方法,这意味着它将在稍后回调,可能在另一个线程上回调。 jsonArrayFirmNamesRequest不会阻止原始线程wii继续,因此它将是空的。它也不会被请求队列处理。 – lordoku

回答

1

发现了一个solution..what我没有解决的问题是建立一个回调接口,并执行该接口的回调方法getFirmNamesOnSuccess()当onResponse一直完成...

接口FirmNamesRequestCallback

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

内部getFirmNamesToPopulateSpinner(最终FirmNamesRequestCallback firmNamesRequestCallback),其被称为与所述接口作为参数 和具体内部onResponse接口的回调方法是EXEC贡献

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 
       } 
      });