【发布时间】:2019-05-18 13:03:47
【问题描述】:
在我的应用程序中,我有 timer 用于一些工作。
当我的应用程序在一段时间后运行时,我的应用程序 freeze 并且无法运行任何 View !
在这个计时器中,每 500ms 我 emit socket.io
我的代码:
AsyncTask.execute(new Runnable() {
@Override
public void run() {
socketPingTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (isSendSocketPing) {
checkSocketPingTimer += startSocketPingTimer;
if (checkSocketPingTimer == sendSocketPingTimer) {
currentTimerForSocket = System.currentTimeMillis();
try {
detailSocketUtils.getSendRTTforPing(currentTimerForSocket + "");
} catch (Exception e) {
}
}
//Show ping (from search)
Constants.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (isShownPing) {
detailToolbar_ping.setVisibility(View.VISIBLE);
if (checkSocketPingTimer > 500) {
detailToolbar_ping.setText(checkSocketPingTimer + "");
detailToolbar_ping.setTextColor(Color.RED);
} else {
detailToolbar_ping.setText(checkSocketPingTimer + "");
detailToolbar_ping.setTextColor(Color.GREEN);
}
} else {
detailToolbar_ping.setVisibility(View.GONE);
}
}
});
socketPing = checkSocketPingTimer;
}
}
}, 500, startSocketPingTimer);
}
});
如何在另一个 thread 中运行此计时器并且不冻结我的应用程序?
【问题讨论】:
-
不要使用
AsyncTask来执行计时器。相反,请使用Handler。这是一个例子:stackoverflow.com/a/4598737/783707 -
你可以使用CountDownTimer,它有一个tick抽象函数来实现你想要实现的任何执行,并且tick可以改变。
-
同意 -
Handler更合适(而不是创建一个新的Runnable以每 500 毫秒更新一次 UI)。这里甚至还有一个更短的版本,可以帮助您摆脱runOnUiThread逻辑 stackoverflow.com/a/15685768/4062197 -
@AnkurAggarwal,谢谢我的朋友。你能把我上面的代码发给我吗?请亲爱的朋友
-
@ymz,谢谢我的朋友。你能把我上面的代码发给我吗?请亲爱的朋友
标签: java android android-thread