【发布时间】: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