gpt4 book ai didi

java - 从单独的线程更新高频 Android UI 线程?

转载 作者:行者123 更新时间:2023-11-29 03:20:06 25 4
gpt4 key购买 nike

我正在尝试以高速更新 EditText,以便数字流动更顺畅。但是我尝试了不同的技术和对象组合,例如 AsyncTask,Thread->Runnable with a handler,Timer->TimerTask with a handler,无论我设置多长时间的时间,它似乎都没有得到比大约 1 秒更好。

我想这可能是它必须通过消息泵传输的事实,但我不能确定。有谁知道我如何获得至少 250 到 500 毫秒的更新频率?更高的频率会更好,但那样就可以了。

更新 2:我注释掉了除 count++ 之外的所有内容;我用这个值更新了一个编辑文本,它确实更新得非常快。所以 updateUi() 中发生的事情正在减慢它的速度。我只是不知道是什么。

更新 1:我切换了 SharedPreferences 的实时使用,我用它来测试原语,以防这是问题的一部分。性能似乎是一样的。唯一定期发生的想法是在计时器上运行的 updateUi() 函数。代码如下,这是我期望快速更新的内容,但没有:

private void updateUi() {

lastDate = cal;
cal = Calendar.getInstance();

synchronized(cal) {

//if the current date is greater than the last stored date
if(compareDates(cal, lastDate) > 0 && count == 0) {
//disable timer
calorieTimer.cancel();
//dereference timer...probably not necessary
calorieTimer = null;
double bankBmr = currentBmr.getBMR() *
activityLevelMultipliers[activityLevelSpinner.getSelectedItemPosition()];
metrics.calorieBank += (int)bankBmr - metrics.caloriesEaten;
prefsEditor.putInt("CALORIE_BANK", metrics.calorieBank);
prefsEditor.putInt("CALORIES_EATEN", 0);
prefsEditor.commit();
metrics.caloriesEaten = 0;
//update lastDate to prevent multiple calorie banking
lastDate = cal;
count++;
Log.e("updateUi()", "count #" + count);
//set up timer again
setupCalorieTimer();
}

caloriesEatenEditText.setText("" + metrics.caloriesEaten);
caloriesRemainingEditText.setText(String.format("%d", (int)activeBmr - metrics.caloriesEaten));
bankEditText.setText("" + metrics.calorieBank);
estimatedWeightEditText.setText(String.format("%.2f", metrics.currentWeight - metrics.calorieBank / 3500.0)) ;
//update the time
time.setToNow();
//update calories available
caloriesAvailableEditText.setText(
String.format("%.2f", activeBmr * percentageOfDay(time) - metrics.caloriesEaten));

} //End synchronized(cal)

} //End updateUi()

private void setupCalorieTimer() {
//create handler to post update back to ui thread
final Handler handler = new Handler();

calorieTimer = new Timer();

calorieTimer.schedule(new TimerTask() {
@Override
public void run() {
//post to ui thread
handler.post(new Runnable() {
@Override
public void run() {
updateUi();
}
});
}
}, 0, 50);
}

最佳答案

尝试来自 df4android 的 AsyncConnector| ,它传递消息的速度非常快。

关于java - 从单独的线程更新高频 Android UI 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24226933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com