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 线程。

//----------------------------------------------------------------------
    // 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 线程之外更新 UI - 即从 TimerTask 您必须只将消息发布到处理程序并从处理程序代码更新 UI。看看这里: Android 计时器?如何?

于 2012-11-06T18:08:55.930 回答