java - 等待功能不起作用 Android Studio

标签 java android multithreading synchronization wait

我正在使用 Android Studio。我正在尝试修复一个按下按钮的时钟,它会将时间返回到 12:00。我让它工作了,但我希望它通过等待 250 毫秒来执行。问题是他们只等待 250 毫秒(但有两次执行,因此时间为 5 秒),然后立即转到 12:00,而不将其显示到 TextView 。我做错了什么吗?另外,如果我在这里应用处理程序函数,恐怕我没有太多使用它的知识。

编辑:这是来 self 的 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();
    }
}

最佳答案

以下是从异步线程更新 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 元素,因为这会导致抛出异常。

关于java - 等待功能不起作用 Android Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37362814/

相关文章:

java - Android:围绕中心旋转图像?

android - React Native 中 XML 内的 Platform.OS

java - 一旦变量设置为 false,如何停止线程?

java - 如何停止在 View 上发布处理程序 - android

java - ArrayList 的空指针异常

java - createNewFile() 不起作用并且图像未存储

java - 如何使用 spring boot 应用程序中另一个属性文件的值解析属性文件中的占位符

android - 不幸的是相机停止了

android - Android 是否有等同于 iOS 的 Google Maps URL 方案?

c++ - 线程池理解问题