2

アプリケーション内のいくつかのアクティビティに期間を表示する必要があります。アクティビティの 1 つが開始されると、タイマーが開始されます。

  • タイマーにサービスを使用する必要がありますか?
  • これが最善の方法ですか?
  • または、 Activity の 1 つからスレッドを開始する必要がありますか?
4

2 に答える 2

2

あなたが説明しているユースケースでは、タイムスタンプを保存し( Data Storage を参照 GUIで使用するためにデルタを計算するのが最善だと思います。アクティビティの 1 つでリアルタイム クロックを表示する必要がある場合は、クロックを更新するためだけに、そのアクティビティに別のスレッドを作成できます。

于 2009-07-16T07:29:38.570 に答える
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
于 2009-07-15T17:21:44.130 に答える