Рекомендация: постоянно обновляйте ArrayAdapter - PullRequest
5 голосов
/ 17 января 2012

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

Таким образом, я могу получить к нему доступ из основного действия и использовать его для моего 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();
    }
};    

Второе: использование отложенного обработчика после приватного финального обработчика обработчика = новый обработчик ();

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
    }
};  

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

Ответы [ 2 ]

1 голос
/ 17 января 2012

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

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

0 голосов
/ 17 января 2012

Вместо использования Handler и Thread вы можете использовать AlarmManager. Просто запустите Alarm один раз, и он обновит ваш список с заданным интервалом без каких-либо потоков или обработчиков. Вы создали службу, и вы можете ссылаться на нее с помощью 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 вы можете получить код для обновления своего списка.

...