2012-01-17 17 views
5

Webからデータを取り出し、アプリケーションに格納されているListを更新するサービスがあります。ベストプラクティス:ArrayAdapterを継続的に更新

したがって、私は主なアクティビティからアクセスでき、それを私のArrayAdapterに使用することができます。

データを更新すると、リストの参照アイテムが変更されます。

私の質問は、メインアクティビティでアダプタのデータを更新するのがベストプラクティスですか?

私は2つの解決策を念頭に置いていますが、正しいかどうかはわかりません。それに加えて、私は多くのバッテリーを使用していないバージョンを実装したいと思います!第二に

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

まず: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のコンセプトであり、Async TaskはAndroidです。

リストビューを更新するには、:mFileAdapter.notifyDataSetChanged();を使用します。それが正しいだけです。

+0

私が間違っている場合は私を訂正してください。私の考えでは、非同期タスクはすぐに実行されているタスクを担当しており、_during_または_after_という更新が必要です。 – Webchen

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には、リストを更新するコードがあります。

関連する問題