2014-01-09 57 views
0

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

//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 onPreExecute() 
     { 

     } 

     protected void onPostExecute(String result) 
     { 
      if(response.equalsIgnoreCase("Success")) 
      { 
      ResultList_List = prServices_resultList;  

      int z=0; 

    for (HashMap<String, String> hashList : prServices_resultList) 
      { 
    Av_List[z] = hashList.get(android_Av_ID); 

    Av_Lat[z] = Double.parseDouble(hashList.get(android_Av_LAT)); 

    Av_Lng[z] = Double.parseDouble(hashList.get(android_Av_LONG)); 

       z++; 
      } 
      } 
     } 
     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; 
     } 
    } 

在我的主類,當我按下一個按鈕:

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()]; 

現在,我得到一個錯誤:java.lang中。 ArrayIndexOutOfBoundsException:length = 0; index = 0

回答

0

首先,將值添加到可從後臺線程訪問的UI-thread的靜態字段ResultList_Services是非常糟糕的做法。你應該重寫你的代碼以保證線程安全。在幾個選項,這裏是一個:

private class JsonResponse extends AsyncTask<String, Void, String> { 

    private ArrayList<HashMap<String, String>> resultList = new ArrayList<HashMap<String, String>>(); 

    ... 

    protected String doInBackground(final String... args) 
    { 
     ... 

     // adding HashList to private JsonResponse's field 
     resultList.add(hashServices); 

     ... 
    } 

    protected void onPostExecute(String result) 
    { 
     if (response.equalsIgnoreCase("Success")) 
     { 
      ResultList_Services = resultList; 
      //TODO: notify your Activity/Dialog on completion 
     } 
    } 
} 

關於你的問題 - 不看新記錄的理由,是你展示的時候有在ResultList沒有值對話框。例如,您應該要求從onPostExecute中顯示。

+0

如果從後臺線程填充靜態是壞的那麼我應該怎麼做.. Plz告訴我這個新的 – AndroidLover

+0

'ResultList_Services = resultList;'將處理這個。請仔細閱讀) –

+0

是的,乍一看我錯過了,但後來我知道你試圖解釋我..你的幫助確實讓我做了一點。如果我得到了渴望結果生病除了你的答案.. – AndroidLover

0

你需要做到這一點 -

for (HashMap<String, String> hashServices : ResultList_Services) 
     { 
      Db_Services[s] = hashServices.get(android_S_CName); 

      Db_ServicesID[s] = hashServices.get(android_S_ID); 
      s++; 
     } 

您的AsyncTask的onPostExcecute()塊。

+0

謝謝你指出了一個錯誤。 – AndroidLover

+0

我更新了我的問題 – AndroidLover

相關問題