在我的应用程序中,我有一个填充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);
}
答案 0 :(得分:2)
答案 1 :(得分:1)
答案 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){
}
}