Android:异步任务加载器

时间:2016-12-30 00:37:55

标签: android android-asynctask

我的应用需要定期从网络上获取数据并每5分钟更新一次。同样,我使用Asynctask获取内容并在后台线程中处理它,然后再将其发送到UI线程。最近,我开始了解Asynctask Loaders及其好处。但是,我无法弄清楚如何每隔5分钟定期调用加载程序来更新内容。

(请注意,之前我使用Timer来调用task.execute()。如果有任何新内容,我需要最终更新我的listview。)

3 个答案:

答案 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的加载器,则忽略新加载器的创建。