2012-01-17 3 views
5

У меня есть служба, которая извлекает некоторые данные из Интернета и обновляет список, который «хранится» в приложении.Лучшая практика: постоянно обновлять ArrayAdapter

Таким образом, я могу получить к нему доступ из основного вида деятельности и использовать его для своего ArrayAdapter.

Когда я обновляю данные, ссылочный элемент из списка изменяется.

Вопрос, как лучше всего обновлять данные в адаптере в основном действии?

У меня есть два решения в виду, но я не знаю, правильны ли они так. Кроме того, я хотел бы реализовать версию, которая не использует много батареи!

Первая: Тема, которая вызывается каждый второй, обновление адаптера с notifyDataSetChanged():

private void startListUpdateThread() 
{ 
    Thread ListManageThread = new Thread() { 
     LinkItem listItem; 
     public void run() { 
      Log.d("DL", "List Update - start"); 
      while(true) 
      { 
       runOnUiThread(UpdateGUIList); 

       try { 
        Thread.sleep(1000); //5Sekunden! 
       } 
       catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        Log.e("DL", "ERROR: InterruptedException - " + e.getMessage()); 
       } 
      } 
     } 
    }; 
    ListManageThread.start(); 
} 

private Runnable UpdateGUIList = new Runnable() { 

    @Override 
    public void run() { 
     mFileAdapter.notifyDataSetChanged(); 
    } 
};  

Во-вторых: Использование замедленное пост Handler частный финальный обработчик Обработчик = новый обработчик();

private void startListUpdate() 
{ 
    handler.removeCallbacks(UpdateListUI); 
    handler.postDelayed(UpdateListUI, 1000); // 1 second 

} 

private Runnable UpdateListUI = new Runnable() { 
    public void run() { 
     //Remove Elements first 
     removeDeletedItemsFromList(); 

     //Update Adapter 
     mFileAdapter.notifyDataSetChanged(); 

     handler.postDelayed(this, 1500); // 1,5 seconds 
    } 
}; 

Итак, что это лучший способ сделать это? Возможно, есть и другой способ сделать это, но о котором я раньше не думал!

ответ

1

Вместо использования обработчика вы будете использовать задачу Async. Хотя обработчик работает здесь, но это концепция JAVA, а Async Task - Android.

И вы можете обновить представление списка с помощью: mFileAdapter.notifyDataSetChanged(); только это правильно.

+0

Пожалуйста, исправьте меня, если я ошибаюсь, но с моей точки зрения задача Async отвечает за выполнение задачи, которая выполняется в ближайшее время и требует обновления _during_ или _after_ задача завершена. – Webchen

0

Вместо использования Handler и Thread вы можете использовать AlarmManager. Просто запустите Alarm один раз, и он обновит ваш список с определенным интервалом времени без Thread или Handler. Вы создали службу, и вы можете ссылаться на эту услугу с помощью AlarmManager.

AlarmManager mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(arg0, TestService.class); 
PendingIntent pi = PendingIntent.getService(arg0, 0, intent, 0); 
mgr.setRepeating(AlarmManager.RTC_WAKEUP, 2000, 2000, pi); 

И в TestService вы можете иметь код, чтобы обновить список.

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