我的问题
我有一个像这样初始化的计时器并调用一个方法来更新一个对象。问题是我每次触发计时器时都会在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);
}
然后这是我的Handler,我用它来处理从这个线程到我的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");
}
我的问题
我是否在处理程序创建,计时器创建,计时器任务创建,textview参考方面遗漏了什么?什么?
提前致谢
答案 0 :(得分:1)
为什么在不使用时在updateViewWithTrack(CCTrack track)
发送CCTrack实例?尝试删除它,您的代码可能正常。
答案 1 :(得分:0)
您似乎只是尝试从UI线程外部更新UI - u.i.来自TimerTask 您只能将消息发布到处理程序并从处理程序代码更新UI。 看看这里: Android timer? How-to?