如何在android中运行函数背景?

时间:2012-07-12 04:54:41

标签: android android-listview

在我的应用程序中,我有一个填充listview的函数。我希望每隔5分钟定期运行一次这个函数。我使用了以下方法。

private class RefreshThread extends Thread{
        public boolean isStop = false;

        public void run(){
            try{
                while(!isStop){                                             
                    Headlines.this.runOnUiThread(new Runnable() {                   
                        public void run() {
                              populate_listview(); //Function to populate listview
                        }
                    });                         
                    try{ Thread.sleep(300000); } catch(Exception ex){}
                }
        }catch(Exception e){
        }
      }
    }

当我使用此方法时,该函数在前台运行,因此整个应用程序都受此影响。我想在后台运行此函数,以便listview更新,用户永远不会知道该函数正在运行。

以下是填充listview的功能。

  public void populate_listview()
         {
                ArrayList<HashMap<String, String>> newsList = new            ArrayList<HashMap<String, String>>();

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

            NodeList nl = doc.getElementsByTagName(KEY_HEAD);
            // looping through all song nodes <song>
            NodeList itemLst = doc.getElementsByTagName("item");
            String MarqueeStr="";

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

                //map.put(KEY_DATE, parser.getValue(e, KEY_DATE));

                newsList.add(map);
    }

4 个答案:

答案 0 :(得分:2)

您可以使用AsyncTask在后台执行活动。

这是一个很好的tutorial

答案 1 :(得分:1)

您可以为此创建一个Android Service,并使用Alarm Manager来调用该服务。

这是一个不错的tutorial

干杯, RJ

答案 2 :(得分:1)

您需要探索AsyncTask类的doInBackground函数。

查看documentation和此example

答案 3 :(得分:0)

要获得较小的性能开销,您应该在后台线程中执行所有准备工作,包括使用正确的值填充HashMap,并仅使用populate_listview()方法newList.add(refresh_thread.getMap());。只需添加到RefreshThread synchronized方法getMap()即可从其他类访问此HashMap,并添加另一个synchronized方法prepareHashMap()以获取准备该代码的代码。显然,您的HashMap必须是RefreshThread类的字段。然后,run()方法将如下所示:

public void run(){
        try{
            while(!isStop){                                             
                prepareHashMap();
                Headlines.this.runOnUiThread(new Runnable() {                   
                    public void run() {
                          populate_listview(); //Function to populate listview
                    }
                });                         
                try{ Thread.sleep(300000); } catch(Exception ex){}
            }
    }catch(Exception e){
    }
  }