2015-12-18 46 views
0

我得到在ResponseFinal log.But循環的響應顯示裏面的物品在List<String> resultList響應爲空resultList的Android - ArrayList中返回null之外循環

我不明白爲什麼resultlist正在恢復空loop.Please幫助

public List<String> getParseJson(String sName) 
{ 
    final List<String> resultList = new ArrayList<String>(); 

    String name=sName.replace(" ", "%20"); 
    StringRequest stringRequest = new StringRequest(Request.Method.GET, Constants.BASE_URL + "/suggest_item/items/"+name +"/"+ Constants.API_KEY, 
     new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       // Result handling 
       try { 
        JSONObject jsonObj = new JSONObject(response.toString()); 
        JSONArray predsJsonArray = jsonObj.getJSONArray("Item"); 

        for (int i = 0; i < predsJsonArray.length(); i++) { 
         System.out.println(predsJsonArray.get(i).toString()); 
         resultList.add(predsJsonArray.get(i).toString()); 
         Log.e("Response",resultList.toString()); 
        } 
       } catch (JSONException e) { 
        Log.e("JSOn", "Cannot process JSON results", e); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       // Error handling 
       System.out.println(error.toString()); 

      } 
    }); 

    // Adding request to request queue 
    Volley.newRequestQueue(context).add(stringRequest); 

    Log.e("ResponseFinal",resultList.toString()); 
    return resultList; 
} 

我的日誌外:

E/Response: [1660309, 1660410] 
E/ResponseFinal: [] 
+0

那麼你的JSON響應是什麼樣子?什麼'Log.e(「ResponseFinal」,resultList.toString());'實際打印到logcat? –

+0

返回'null'或空列表? –

+0

發佈您的日誌。 – Pankaj

回答

2

項目申報表前oncreate()(在類級別定義​​)

List<String> resultList = new ArrayList<String>(); 
+0

我已經試過這個,但得到相同的結果 – nithin

+0

然後檢查其他代碼.. – sasikumar

1

我不明白爲什麼​​是外循環回空...

它是空的,因爲你的要求異步運行。因此,您創建請求以及響應偵聽器,將它傳遞給Volley,然後getParseJson()返回空列表 - 因爲請求尚未執行,而其他代碼不會等待它執行。之後,當執行請求(並且它異步執行)時,您的響應偵聽器會將JSON值添加到​​,但已爲時過晚。

重寫您的代碼,以便處理Volley請求的異步性質。

1

您添加的列表是副本,並且僅在public void onResponse(String response)內部具有作用域。因此,實際列表是空的,因爲它是在定義時。所以,最後的日誌顯示爲空。

1

在回覆即將到來之前,您正在返回列表,這就是爲什麼您要清空列表。你可以做一些類似下面的代碼,這些代碼可以讓你在迴應後列出。

步驟1:製作方法命名爲onSuccess(List<String> list)getParseJson()方法

public void onSuccess(List<String> list){ 
    // do your code here after getting the list 
} 

//make this method as void 
public void getParseJson(String sName){ 
    //your code which you have already implemented 
} 

步驟2:呼叫從onResponse()方法上面的方法,它是你的getParseJson()方法內聲明如下:

@Override 
    public void onResponse(String response) { 
       // Result handling 
       try { 
        JSONObject jsonObj = new JSONObject(response.toString()); 
        JSONArray predsJsonArray = jsonObj.getJSONArray("Item"); 

        for (int i = 0; i < predsJsonArray.length(); i++) { 
         System.out.println(predsJsonArray.get(i).toString()); 
         resultList.add(predsJsonArray.get(i).toString()); 
         Log.e("Response",resultList.toString()); 
        } 

       } catch (JSONException e) { 
        Log.e("JSOn", "Cannot process JSON results", e); 
       } 

       //call here 
       onSuccess(resultList); 
} 

編輯: 如果從另一個類調用getParseJson()然後調用它,如下所示:

//If you are having paramaterized constructor then you can give parameter 
new YourClassName(){ 
    @Override 
    public void success(List<String> list) { 
      // do your code here after getting the list 
    } 
}.getParseJson(String response);