2013-07-16 58 views
3

我犯了一些错误,我不知道如何离开。 原来,代码是这样的,它的工作原理:在AsyncTask中传递ArrayList <HashMap <String,String >>

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

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

     XMLParser parser = new XMLParser(); 
     String xml = parser.getXmlFromUrl(URL); // getting XML 
     Document doc = parser.getDomElement(xml); // getting DOM element 

     NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
     // looping through all item nodes <item> 
     for (int i = 0; i < nl.getLength(); i++) { 
      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 
      Element e = (Element) nl.item(i); 
      // adding each child node to HashMap key => value 
      map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
      map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
      map.put(KEY_COST, parser.getValue(e, KEY_COST)); 

      // adding HashList to ArrayList 
      menuItems.add(map); 
     } 

     // Adding menuItems to ListView 
     ListAdapter adapter = new SimpleAdapter(this, menuItems, 
       R.layout.list_item, 
       new String[] { KEY_NAME, KEY_COST }, new int[] { 
         R.id.name, R.id.cost }); 

     setListAdapter(adapter); 


    } 

现在,因为我把另一个活动,我应该是错误的。 学习了一下,我发现你需要使用taskasync,但不知道如何结束。 这是代码:

public class TaskAsincrono extends AsyncTask<ArrayList<String>, Void, ArrayList<String>> { 
     @Override 
     protected void onPreExecute(){ 
     } 

     @Override 
     protected void onProgressUpdate(Void[] values) { 

     }; 

     @Override 
     protected ArrayList<String> doInBackground(ArrayList<String>... params) { 
      ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

      XMLParser parser = new XMLParser(); 
      String xml = parser.getXmlFromUrl(URL); // getting XML 
      Document doc = parser.getDomElement(xml); // getting DOM element 

      NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
      // looping through all item nodes <item> 
      for (int i = 0; i < nl.getLength(); i++) { 
       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 
       Element e = (Element) nl.item(i); 
       // adding each child node to HashMap key => value 
       map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
       map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
       map.put(KEY_COST, parser.getValue(e, KEY_COST)); 

       // adding HashList to ArrayList 
       menuItems.add(map); 

      } 

      return menuItems; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<String> success) { 
      //se l'alert è visibile viene rimosso 
      if(dialog.isShowing()) dialog.dismiss(); 

      ListAdapter adapter = new SimpleAdapter(this, menuItems, 
        R.layout.list_item, 
        new String[] { KEY_NAME, KEY_COST }, new int[] { 
          R.id.name, R.id.cost }); 

      setListAdapter(adapter); 

     } 

     @Override 
     protected void onCancelled() { 
      mAuthTask = null; 
     } 
    } 

我该怎么办?

非常感谢你

+0

究竟是什么问题 – Raghunandan

+0

不行,我不知道怎么的ArrayList传递给OnPostExecute。因为return menuItems;出错 – Valkyrie00

+0

'doInbackground'计算的结果是'onPostExecute'的参数。改变你的'onpostExecute'参数为'ArrayList >成功' – Raghunandan

回答

1

只要按照拉古丹丹的建议。

如果你的返回类型是ArrayList < HashMap < String,那么你为什么返回ArrayList < Sting>。

更改它想:

public class TaskAsincrono extends AsyncTask<ArrayList<String>, Void, ArrayList<String>> 

public class TaskAsincrono extends AsyncTask<String, Void, ArrayList<HashMap<String,String>>> 

也:

@Override 
protected ArrayList<String> doInBackground(ArrayList<String>... params) 

@Override 
    protected ArrayList<HashMap<String,String>> doInBackground(String... params) 

我觉得你在程序中doInBackground()需要的URL作为它的参数,所以你可以将它从ArrayList中<字符串改变>以简单的String [] ..

您的AsyncTask骨架是一样的东西:

public class TaskAsincrono extends AsyncTask<String, Void, ArrayList<HashMap<String, String>>> { 

    @Override, 
    protected void onPreExecute(){ 
     //what you want to do before AsyncTask execution(runs on UI thread) 
     ...................... 
    } 

    @Override 
    protected void onProgressUpdate(Void[] values) { 
     //About updates.......... 
    }; 

    @Override 
    protected ArrayList<HashMap<String, String>> doInBackground(String... params) { 
     ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); 

     for (String extraUrl : params) { 
      //do all stuffs here 
      //like parse xml stuffs 
      //put them to hashmap then add the hashmap to arraylist(menuitems).... 
      } 
      return menuItems; 
     } 
} 

现在你可以像这样从AsyncTask之外(例如button onclick或onCreate())获取ArrayList。

TaskAsincrono task = new TaskAsincrono (); 
    try { 
     ArrayList<HashMap<String, String>> arr = new ArrayList<HashMap<String, String>>(); 
     arr = task.execute(URL).get(); 

并且还按照Developer Link For AsyncTask了解更多关于它。

万事如意

相关问题