2012-01-17 63 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(); 
    } 
};  

第二:)用延迟处理程序后 私人最终处理程序的处理程序=新处理程序(;

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

而不是使用处理程序,您将使用异步任务。虽然处理程序在这里工作,但它是JAVA的概念和异步任务是Android。

而且,您可以使用以下命令更新列表视图:mFileAdapter.notifyDataSetChanged();只有它是正确的。

+0

请纠正我,如果我错了,但从我的角度来看,异步任务负责一个任务很快运行,需要更新_during_或_after_任务完成后。 – Webchen 2012-01-17 14:25:25

0

而不是使用HandlerThread您可以使用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你可以有代码更新您的列表。