我有一个服务从Web获取一些数据并更新一个“存储”在应用程序中的List。
因此,我可以从主活动访问它并将其用于我的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 final Handler handler = new 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
}
};
那么,最好的办法是什么?也许还有另一种方法可以做到这一点,但我以前没有想到过!
答案 0 :(得分:1)
您将使用Async任务而不是使用处理程序。虽然处理程序在这里工作,但它是JAVA概念,Async Task是Android。
您可以使用以下命令更新列表视图:mFileAdapter.notifyDataSetChanged();只有它是正确的。
答案 1 :(得分:0)
您可以使用Handler
而不是Thread
和AlarmManager
。只需启动一次警报,它将使用定义的间隔时间段更新列表,而无需任何线程或处理程序。您已经创建了一个服务,您可以使用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
中,您可以使用代码更新您的列表。