【问题标题】:Handler.postDelayed causes lagHandler.postDelayed 导致滞后
【发布时间】:2015-12-03 01:41:38
【问题描述】:

我创建了一个可以使用我们的 SIP 服务器进行呼叫的应用程序。现在我要做的是向用户显示他的通话持续了多长时间。我的脚本实际上正在运行,但我注意到通话时间越长,我的应用程序就会变得越迟钝。这是我的代码的 sn-p

Handler h = new Handler(Looper.getMainLooper());
_isOnCall = true;
long time = 0;
int x = 0;

while(_isOnCall) {
     if (_isOnCall){
         final int counter = 1 + x;
         time += 1000;
         h.postDelayed(new Runnable() {
             @Override
             public void run() {
                 (TargetDetailsActivity.this).runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                         final int seconds = counter % 60;
                         final int minutes = (counter % 3600) / 60;
                         final int hours = counter / 3600;

                         callcounter.post(new Runnable() {
                             @Override
                             public void run() {
                                 callcounter.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));
                             }
                         });
                     }
                 });
             }
         }, time);
         x++;
     }else{
         break;
     }
}

基本上,该代码的作用只是计算他接听电话的秒数/分钟数/小时数。当他挂断时,我调用下面的代码:

_isOnCall = false;
h.removeCallbacksAndMessages(null);

我不确定是什么导致了延迟。帮助!谢谢。

更新

我能够利用 galvan 的建议使用 Timer 来完成这项工作。这是我的代码供将来参考:

private Timer myTimer;
private int counter_time=0;

public void onCallEstablished() {
    myTimer = new Timer();
    myTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            TimerMethod();
        }

    }, 0, 1000);
}

private void TimerMethod()
{
    this.runOnUiThread(Timer_Tick);
}

private Runnable Timer_Tick = new Runnable() {
    public void run() {
        counter_time++;
        int seconds = counter_time % 60;
        int minutes = (counter_time % 3600) / 60;
        int hours = counter_time / 3600;

        callcounter.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));
    }
};


public void releaseCall(){

    if(myTimer != null){
        myTimer.cancel();
        myTimer.purge();
        counter_time = 0;
    }
}

【问题讨论】:

  • 是在ui线程上运行的while循环吗?
  • @Blackbelt 嗯,对不起,我不完全明白你对 UI 线程的意思。我对安卓很陌生。 :(
  • @user3360031:发布完整代码。这段代码写在UI线程???
  • @V_J 代码很长。但是给你一个想法,它在我的活动课上。
  • Handler 和 postDelayed 更适合用于小操作,假设为 2 秒。为此操作创建自己的线程。您可以制作自己的线程,也可以使用 Executor。谷歌关于 Executor 和 Handler。你会得到很多例子。

标签: java android performance android-handler


【解决方案1】:

看起来每个 Runnable 都保存了对其父对象的引用,在这种情况下是嵌套的 Runnable。尝试拍摄堆快照以检测内存问题,看看是否是这种情况。

你也可以做一个有时间间隔的重复任务,并在调用结束时停止循环。

Timer timer = new Timer();
TimerTask myTask = new TimerTask() {
    @Override
    public void run() {
        // whatever you need to do every 2 seconds
    }
};

timer.scheduleAtFixedRate(myTask,
                       firstTime,
                       period);

有关计时器的更多信息,您可以查看docs

【讨论】:

  • 感谢您的意见。我能够使用计时器使其工作。请查看我更新的帖子。
猜你喜欢
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多