1

私の問題

そのように初期化され、メソッドを呼び出してオブジェクトを更新するタイマーがあります。問題は、タイマーが起動するたびに LogCat で GC_CONCURRENT 出力を取得していることです。

11-01 11:56:43.042: D/dalvikvm(30950): GC_CONCURRENT freed 774K, 52% free 3303K/6791K, external 1763K/2129K, paused 3ms+4ms

これは、タスクと一緒にタイマーを初期化したものです。

    if (CCTrackManager.timer == null) 
        CCTrackManager.timer = new Timer("TrackUpdate");
    MyTimerTask task = new MyTimerTask();
    CCTrackManager.timer.scheduleAtFixedRate(task, 0, 1000);

したがって、これは一度呼び出され、再度呼び出されることはありません (タイマーが停止して再起動されない限り)。

私の更新方法はそのように見えます。

 public void addSecondToTrackDuration() {
      this._currentRecordingTrack.setDuration(this._currentRecordingTrack.getDuration() + 1);
      this.mListener.trackUpdated(this._currentRecordingTrack);
  }

次に、このスレッドから UI スレッドへの値の取得を処理するために使用する Handler を次に示します。

//----------------------------------------------------------------------
    // HANDLES THE UPDATE OF THE TRACK. NEEDS HANDLER BECAUSE THE TIMER WHICH CALLS THIS RUNS ON ANOTHER THREAD 
    //----------------------------------------------------------------------
    static class UpdateTrackHandler extends Handler {

        WeakReference<MainActivity> mActivity;
        UpdateTrackHandler(MainActivity act) {
            mActivity = new WeakReference<MainActivity>(act);
        }

        @Override 
        public void handleMessage(Message msg) {
            TrackFragment tf = (TrackFragment) mActivity.get().getSupportFragmentManager().findFragmentByTag(RECORDING_TRACK_FRAG);
            if (tf != null) {
                tf.updateViewWithTrack((CCTrack)msg.obj);
            }
        }
    }

    UpdateTrackHandler mHandler = new UpdateTrackHandler(this);

    //----------------------------------------------------------------------
        // CALLED FROM CCTRACKMANAGER WHEN AN UPDATE OCCURS ON THE  CURRENT RECORDING TRACK
        //---------------------------------------------------------------------- 
        public void trackUpdated(CCTrack track) {
            Message msg = new Message();
            msg.obj = track;
            mHandler.sendMessage(msg);
        }

これは問題ではないと思います。問題は、TextView をコメントアウトしたときに実際に更新しているフラグメントにあると思いますがthis.durationValueTxtView.setText("TIME");、それはもう起こりません。

public void updateViewWithTrack(CCTrack track) {
    this.durationValueTxtView.setText("TIME");
}

私の質問

ハンドラーの作成、タイマーの作成、タイマー タスクの作成、テキストビューの参照に関して何か不足していますか? なんでも?

前もって感謝します

4

2 に答える 2

1

updateViewWithTrack(CCTrack track)使用していないときにCCTrack インスタンスを送信するのはなぜですか? 削除してみてください。コードが正常に動作する可能性があります。

  • GC_CONCURRENT は、コードでメモリ リークが発生するたびにスローされます。
  • これこれを読んでみてください
于 2012-11-08T07:53:59.000 に答える
0

UI スレッドの外部から、つまり TimerTask から UI を更新しようとするだけのようです。メッセージをハンドラーにポストし、ハンドラー コードから UI を更新するだけで済みます。こちらをご覧ください: Android タイマー? 方法?

于 2012-11-06T18:08:55.930 に答える