【问题标题】:Wait Function not working Android Studio等待功能不起作用 Android Studio
【发布时间】:2016-05-21 12:19:05
【问题描述】:

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

【问题讨论】:

    标签: java android multithreading synchronization wait


    【解决方案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 无响应),同时异步更新您的 TextViews。

    此外,您不应该尝试在主线程上下文之外更新 UI 元素,因为这会导致引发异常。

    【讨论】:

    • 使用线程不是一个好主意吗?但无论哪种方式,我仍然会尝试。另外,我认为我不能将其称为 MainActivity,因为它是私有的。我这样称呼它new SampleActivity.ClockTask(hourHand, minuteHand).execute();
    • 您可以使用 Thread 代替 AsyncTask。当您说它是私有的时,您是什么意思?也许您可以提供更多代码以及您想要实现的目标。
    • 呃,我正在尝试调用你为我的 MainActivity 编写的代码。然后我尝试做:SampleActivity act = new SampleActivity(); 然后在底部act.ClockTask(hourHand,minuteHand).execute();
    • 不,不。 SampleActivity 只是一个例子。将ClockTask 类、updateHourText()updateMinuteText() 方法复制粘贴到您的MainActivity 中,然后您可以从任何地方调用new ClockTask(hourHand, minuteHand).execute();
    • 哦。我懂了。我现在就去试试:)
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2023-03-31
    • 1970-01-01
    • 2020-01-20
    • 2018-04-13
    • 2019-11-26
    相关资源
    最近更新 更多