我的应用需要定期从网络上获取数据并每5分钟更新一次。同样,我使用Asynctask获取内容并在后台线程中处理它,然后再将其发送到UI线程。最近,我开始了解Asynctask Loaders及其好处。但是,我无法弄清楚如何每隔5分钟定期调用加载程序来更新内容。
(请注意,之前我使用Timer来调用task.execute()。如果有任何新内容,我需要最终更新我的listview。)
答案 0 :(得分:1)
我会使用计时器每5分钟更新一次数据。在计时器内部创建一个异步任务。获取doInBackground()
中的数据。更新onPostExecute()
中的用户界面。您可以将在doInBackground()
中提取的数据传递给onPostExecute()
。有关详细信息,请查看:https://developer.android.com/reference/android/os/AsyncTask.html
答案 1 :(得分:1)
如果您希望仅在应用程序运行时执行代码,为了定期调用任务并在获取信息后在UI线程中执行某些操作,您可以使用Dictionary
。
在您的活动中,声明:
public Dictionary GetData(string data) {
Dictionary<string, string> dictRet = new Dictionary<string, string>();
strKeyPairs = data.Split(new[] { ";" }, StringSplitOptions.None);
foreach (string strKeyPair in strKeyPairs) {
strKeyValuePair = strKeyPair.Split(new[] { "=" }, StringSplitOptions.RemoveEmptyEntries);
if (strKeyValuePair.Length > 0) {
if (strKeyValuePair.Length == 2) {
dictRet[strKeyValuePair[0]] = strKeyValuePair[1];
} else {
dictRet[strKeyValuePair[0]] = string.Empty;
}
}
}
return dictRet;
}
ScheduledExecutorService
如果您需要取消活动private ScheduledExecutorService scheduleTaskExecutor;
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
Future<?> future = scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// Fetch your data
runOnUiThread(new Runnable() {
@Override
public void run() {
// Do the update in your UI
}
});
}
}, 0, 5, TimeUnit.MINUTES);
中的scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
以便以后重复使用,请使用:
ScheduledExecutorService
如果要删除该服务,请使用:
onPause
答案 2 :(得分:1)
我终于明白了。
使用加载器时,如果我们需要定期使用新数据更新加载器,我们需要使用restartLoader而不是initLoader。 RestartLoader杀死前一个加载器并建立一个新的加载器,而initLoader如果已经存在一个带有该id的加载器,则忽略新加载器的创建。