アプリケーション内のいくつかのアクティビティに期間を表示する必要があります。アクティビティの 1 つが開始されると、タイマーが開始されます。
- タイマーにサービスを使用する必要がありますか?
- これが最善の方法ですか?
- または、 Activity の 1 つからスレッドを開始する必要がありますか?
アプリケーション内のいくつかのアクティビティに期間を表示する必要があります。アクティビティの 1 つが開始されると、タイマーが開始されます。
あなたが説明しているユースケースでは、タイムスタンプを保存し( Data Storage を参照)、 GUIで使用するためにデルタを計算するのが最善だと思います。アクティビティの 1 つでリアルタイム クロックを表示する必要がある場合は、クロックを更新するためだけに、そのアクティビティに別のスレッドを作成できます。
進行状況を表示するために必要なインターフェイスの作業量に応じて、アクティビティ内でスレッドを開始し、スレッドの進行状況をチェックして必要に応じてインターフェイスを更新するタイマーを作成します。サービスは、多くのインターフェイス通知/更新を必要としないバックグラウンド タスクに適しています。
これは、私が現在取り組んでいるプロジェクトの例です (UpdateListRunnable は、リスト アダプターで "notifyDataSetChanged()" を呼び出すだけです。コードで複数回実行するため、クラスにカプセル化しました。また、updateHandler は通常のハンドラーです。実例):
@Override
public void run() {
Timer updateProgressTimer = null;
UpdateItem currentItem = null;
for(int i = 0; i < items.size(); i++) {
currentItemIndex = i;
currentItem = items.get(i);
if (currentItem.isSelected() == true) {
updateProgressTimer = new Timer();
updateProgressTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
updateHandler.post(new UpdateListRunnable());
}
}, 0, 2000); // check every 2 seconds
lookupDb.downloadUpdate(currentItem);
currentItem.setUpToDate(true);
currentItem.setStatusCode(UpdateItem.UP_TO_DATE);
currentItem.setProgress(0);
updateProgressTimer.cancel();
updateHandler.post(new UpdateListRunnable());
} // end if its the database we are hosting on our internal server
} // end for loop through update items
currentItemIndex = -1;
} // end updateThread run