2014-01-09 33 views
0

已更新的問題來自上一個:我通過HashMap填充數組,Iam使用Asynctask進行http請求&填充數組後將該數組放入對話框中。當我第一次運行我的應用程序,它給了我一個空的對話框&沒有給出任何錯誤,但是當我重新運行我的應用程序時,它完美地顯示了對話框中的所有數組元素。什麼原因 ?ArrayExceptionOut Of Bound

//JsonResponse Inner Class in main class 

private class JsonResponse extends AsyncTask<String, Void, String> 
{ 
    String response = ""; 
    private ArrayList<HashMap<String, String>> prServices_resultList = 
     new ArrayList<HashMap<String, String>>(); 

    protected void onPostExecute(String result) 
    { 
     if(response.equalsIgnoreCase("Success")) 
     { 
      ResultList_List = prServices_resultList;  
      int s=0; 
      for (HashMap<String, String> hashServices : prServices_resultList) 
      { 
       Db_Services[s] = hashServices.get(android_S_CName);     
       Db_ServicesID[s] = hashServices.get(android_S_ID); 
       s++; 
      } 
     } 
    } 

    protected String doInBackground(final String... args) 
    {  
     JSONParser jParser = new JSONParser(); 
     JSONArray jArrayServices = jParser.getJSONFromUrl(url_Services); 

     try 
     { 
      for (int i = 0; i < jArrayServices.length(); i++) 
      { 
       JSONObject jsonElements = jArrayServices.getJSONObject(i); 

       String S_id = jsonElements.getString(android_S_ID); 
       String S_name = jsonElements.getString(android_S_NAME); 

       HashMap<String, String> hashServices = new HashMap<String, String>(); 

       // adding each child node to HashMap key 
       hashServices.put(android_S_ID, S_id); 
       hashServices.put(android_S_NAME, S_name); 

       // adding HashList to ArrayList 
       prServices_resultList.add(hashServices); 
      } 
      response = "Success"; 
     } 
     catch(JSONException e) 
     { 
      e.printStackTrace(); 
     } 
     return response; 
    } 
} 

在我的主要類有有一個按鈕&當我按下我執行的AsyncTask:

new JsonResponse().execute; 

在上面的onCreate主類我聲明,如:

static ArrayList<HashMap<String, String>> ResultList_Services = 
    new ArrayList<HashMap<String, String>>(); 

String[] Db_Services = new String[ResultList_Services.size()]; 
String[] Db_ServicesID = new String[ResultList_Services.size()]; 
+0

您可以指向引發異常的確切行嗎? – JRomero

+0

你確定在第一次運行中你等待AsyncTask完成它的工作嗎?可能在第二輪中,數據已準備就緒。 –

+0

@ J.Romero問題是我的數組在主要活動的頂部並等於arraylist.size ..我想在Asynctask中使用這些數組來獲得http響應的填充..我把它們放在主要活動中的原因是因爲我想在主要活動的其他方法中使用它們.. – AndroidLover

回答

1

要創建空圖如下:

ResultList_Services = new ArrayList<HashMap<String, String>>(); 

然後嘗試初始化兩個數組,其大小爲空映射 - 爲零。

// ResultList_Services.size() will be zero 
String[] Db_Services = new String[ResultList_Services.size()]; 
String[] Db_ServicesID = new String[ResultList_Services.size()]; 

所以,當你嘗試加入到這些陣列會拋出OutOfBoundsException


你可以把這些數組到列表中,那麼你就可以動態地添加元素需要,而無需指定大小從...開始。如果再需要一個數組(其它方法),你可以使用get從列表中的陣列List#toArray()


根據您的評論

你可以只建立臨時數組向其中添加的所有元素,然後將其分配給您的其他陣列,如

protected void onPostExecute(String result) 
{ 
    if(response.equalsIgnoreCase("Success")) 
    { 
     ResultList_List = prServices_resultList;  
     String[] tmp_dbServ = new String[prServices_resultList.size()]; 
     String[] tmp_dbServID = new String[prServices_resultList.size()]; 
     int s=0; 
     for (HashMap<String, String> hashServices : prServices_resultList) 
     { 
      tmp_dbServ[s] = hashServices.get(android_S_CName);     
      tmp_dbServID[s] = hashServices.get(android_S_ID); 
      s++; 
     } 
     Db_Services = tmp_dbServ; 
     Db_ServicesID = tmp_dbServID; 
    } 
} 
+1

+1你快速 – PopoFibo

+0

@Java惡魔我想要的是在asynctask完成後填充這些數組,因爲我把數組放在活動的開始是因爲我想要在主要活動中使用他們其他方法..我知道他們得到零。我有一個按鈕,我想開始asynctask,當我按它,然後填寫這些數組,任何解決方案 – AndroidLover

+0

@AndroidLover使用動態大小列表,而不是固定大小的數組。如果需要,您可以始終從列表中獲取數組。 –