1

在我的应用程序中,我有一个填充列表视图的功能。我想每 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){
        }
      }
    }

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

以下是填充列表视图的功能。

  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

4 回答 4

2

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

这是一个很好的教程

于 2012-07-12T04:59:34.460 回答
1

您可以为此创建一个 Android服务并使用警报管理器来调用该服务。

这是一个很好的教程

干杯, RJ

于 2012-07-12T04:59:41.907 回答
1

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

查看文档和此示例

于 2012-07-12T05:02:09.007 回答
1

为了获得更小的性能开销,您应该HashMap在后台线程中进行所有准备工作,包括使用适当的值填充并populate_listview()仅保留方法newList.add(refresh_thread.getMap());。只需添加到RefreshThread synchronized方法以从另一个类getMap()访问它,并为准备它的代码添加另一个方法。显然,你必须是一个类的领域。然后,该方法将如下所示:HashMapsynchronizedprepareHashMap()HashMapRefreshThreadrun()

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){
    }
  }
于 2012-07-12T05:14:36.443 回答