2016-12-30 4 views
-2

Мое приложение должно периодически получать данные из Интернета и обновлять себя каждые 5 минут. Для этого я использовал Asynctask для извлечения содержимого и обработки его в фоновом потоке перед отправкой его в поток пользовательского интерфейса. Недавно я узнал о загрузчиках Asynctask и его преимуществах. Однако я не могу понять, как периодически вызывать загрузчика каждые 5 минут для обновления содержимого.Android: загрузчики Async-задач

(Пожалуйста, обратите внимание, раньше я использовал таймер для вызова task.execute(). Мне нужно, наконец, обновить ListView, если есть новое содержание.)

ответ

1

Я хотел бы использовать таймер для обновления данных вам каждые 5 минут. Внутри таймера создайте задачу async. Извлеките данные в doInBackground(). Обновите пользовательский интерфейс в onPostExecute(). Вы можете передать данные, полученные вами в doInBackground(), до onPostExecute(). Для получения дополнительной информации проверьте: https://developer.android.com/reference/android/os/AsyncTask.html

+0

Это то, что я делал до сих пор. Тем не менее, я читал, что вращающиеся экраны перезапускают активность, и, следовательно, загрузчики лучше, чем asynctasks. Как вы думаете? Есть ли способ, которым я могу использовать загрузчики и выполнять одну и ту же задачу по периодическому обновлению данных? –

+0

Проверьте это: http://stackoverflow.com/questions/7120813/asynctaskloader-vs-asynctask – beeb

1

Если вы хотите, чтобы ваш код выполнялся только в том случае, когда ваше приложение запущено, чтобы периодически выполнять задачу и делать что-то в своем потоке пользовательского интерфейса после получения вашей информации, вы можете использовать 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 в вашей деятельности, чтобы использовать его позже, используйте:

future.cancel(true); 

Если вы хотите удалить эту услугу, используйте:

scheduleTaskExecutor.shutdown(); 
1

Я понял, наконец.

При использовании погрузчиков нам необходимо использовать перезагрузку вместо initLoader, если нам нужно периодически обновлять загрузчик новыми данными. RestartLoader убивает предыдущего загрузчика и устанавливает новый, в то время как initLoader игнорирует создание нового загрузчика, если уже существует загрузчик с этим идентификатором.

Смежные вопросы