等待功能无法使用Android Studio

时间:2016-05-21 12:19:05

标签: java android multithreading synchronization wait

我正在使用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();
    }
}

1 个答案:

答案 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元素,因为它会导致抛出异常。