2015-09-07 150 views
0

我创建了一个可以使用我们的SIP服务器进行调用的应用程序。现在我想要做的是向用户显示他的通话持续了多久。我的脚本实际上正在工作,但我注意到通话时间越长,我的应用程序就会变慢。下面是我的代码Handler.postDelayed导致延迟

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); 

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

UPDATE

我能够通过使用定时器利用高尔文的建议,使这一工作。这是我以供将来参考代码:

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; 
    } 
} 
+1

是while循环在UI线程上运行? – Blackbelt

+0

@Blackbelt uhm抱歉,我不完全知道你对UI线程的意思。我对android非常陌生。 :( – user3360031

+0

@ user3360031:发布完整的代码,这段代码是否写在UI线程中? –

回答

0

它看起来就像每一个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

+0

谢谢你的输入。我能够使用Timer进行工作,请参阅我更新的帖子。 – user3360031

相关问题