2012-01-17 68 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你可以有代碼更新您的列表。