我正在使用Android Studio。我正在尝试修复按下按钮的时钟,它会将时间返回到12:00。我得到了它的工作,但我希望它等待250毫秒执行。问题是他们只等待250毫秒(但有两次执行,所以这是5秒),然后它立即转到12:00而不显示到文本视图。有什么我做错了吗?此外,如果我在这里应用处理函数,恐怕我没有太多的知识来使用它。
编辑:这是来自我的MainActivity方法。例如,从1更改为2然后等待250毫秒,从2更改为3然后等待250毫秒
synchronized (this){
try {
while(minuteHand != 0 || hourHand != 12){
if (hourHand != 12){
hourHand++;
hourText.setText(Integer.toString(hourHand));
wait(250);
}
if (minuteHand != 0) {
minuteHand += 5;
minuteHand %= 60;
minuteText.setText(Integer.toString(minuteHand));
wait(250);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
以下是从异步线程更新UI元素的正确方法:
public class SampleActivity extends Activity {
private TextView hourText;
private TextView minuteText;
private void updateHourText(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
hourText.setText(text);
}
});
}
private void updateMinuteText(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
minuteText.setText(text);
}
});
}
private class ClockTask extends AsyncTask<Void, Void, Void>
{
private int hourHand;
private int minuteHand;
public ClockTask(int hourHand, int minuteHand) {
this.hourHand = hourHand;
this.minuteHand = minuteHand;
}
@Override
protected Void doInBackground(Void... voids) {
try {
while(minuteHand != 0 || hourHand != 12){
if (hourHand != 12){
hourHand++;
updateHourText(Integer.toString(hourHand));
Thread.sleep(250);
}
if (minuteHand != 0) {
minuteHand += 5;
minuteHand %= 60;
updateMinuteText(Integer.toString(minuteHand));
Thread.sleep(250);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
}
然后从按钮的onClickListener()
:
new ClockTask(hourHand, minuteHand).execute();
正如您所看到的,为了更新TextView
的文本,需要一个辅助方法,它总是在主线程中执行TextView.setText()
。这样,您的业务逻辑可以在其自己的线程内执行(不会导致主线程等待,这会导致无法响应的UI),同时异步更新TextView
。
此外,您不应该尝试更新主线程上下文之外的UI元素,因为它会导致抛出异常。