【问题标题】:Android postDelayed does not delayAndroid postDelayed 不延迟
【发布时间】:2015-02-15 17:09:52
【问题描述】:

如果我使用 postDelayed 方法,我的 Android 应用程序不会延迟一秒(或 10 秒)。

基本上我希望我的程序在单击按钮后等待一秒钟,然后更新我的 textview ("READY") 上的文本,再等待 2 秒钟,然后再次更新 textview ("SET") 然后它应该开始另一个活动(尚未实现:-))。

使用我的代码,程序启动,在我单击按钮后,textview 立即显示最后一个文本("SET")。它只是不等待。

我做错了什么?

这是我的代码:

public class MyCounterActivity extends Activity {

private long mInternval = 100000;
private Handler mHandler;

private Runnable mStatusChecker = new Runnable() {
    @Override
    public void run() {
        //updateInterval(); //change interval
        startRepeatingTask();
    }
};

void startRepeatingTask(){
    mHandler.postDelayed(mStatusChecker, mInternval);
    //mStatusChecker.run();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gym_counter);

    final TextView tv1 = (TextView) findViewById(R.id.fullscreen_content);
    final Button startButton = (Button) findViewById(R.id.startbutton);

    startButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            final long up;
            EditText textUp = (EditText) findViewById(R.id.editTextUp);                
            up = Integer.parseInt(textUp.getText().toString());

            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //
                }
            },1000);
            Log.d("after 1 runnable", "whaaat");

            tv1.setText("Ready");
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //
                }
            }, 2000);

            Log.d("after 2nd runnable", "whaaat 2");
            //startRepeatingTask();
            tv1.setText("SET");
        }
    });
}

我还尝试使用runOnUiThread() 运行它(在onClick(View v) 内,但结果相同)。我预计它会等待 1 秒(startRepeatingTask())然后运行循环并等待几秒钟......

                    runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        startRepeatingTask();
                            for (int u = 0; u < up; u++){
                                startRepeatingTask();
                            }
                        }
                    }
                });

希望我的描述有意义:-)。

感谢您的帮助!

编辑: 我现在能够为我的第一个问题找到解决方案。 @mad 在这篇文章中的回答帮助了我:How to start a different activity with some delay after pressing a button in android? (这可能与@laalto 试图告诉我的相同。感谢您的提示!)

onClick()

            tv1.setText("READY");
            mHandler.postDelayed(mDelay1, 2000);

然后是 Runnable

    private Runnable mDelay1 = new Runnable() {
    @Override
    public void run() {
        if (tv1.getText()=="READY")
            tv1.setText("SET");
    }
};

但是: 如果我想每秒刷新 Textview 上的文本,我该怎么做?我不能只是多次致电mHandler.postDelayed().. 任何帮助表示赞赏。

【问题讨论】:

    标签: android


    【解决方案1】:

    当您调用postDelayed() 时,它只是将Runnable 放入队列并立即返回。它不会等待 runnable 被执行。

    如果您需要延迟后发生某些事情,请将代码放入可运行对象的run() 方法中。

    【讨论】:

    • 我尝试关注:private long mInternval = 100000;私有处理程序 mHandler; private Runnable mStatusChecker = new Runnable() { @Override public void run() { mHandler = new Handler(); mHandler.postDelayed(this,mInternval); } };在我的代码中,我用这个“mStatusChecker.run();”开始它......但它仍然没有延迟......或者我理解错了吗?谢谢你的帮助!
    • 在可运行对象上调用 run() 会立即同步运行代码。在没有任何额外操作的情况下重新发布可运行文件本身并没有真正有用。
    • 对不起,我不明白你在说什么:-\。你可以给我一个例子吗?非常感谢。
    【解决方案2】:

    每当您调用诸如 Thread.start()、handler.postDelayed、view.postDelayed、AsynchTask、TimerTask 之类的东西时,您就进入了线程的世界,或者您可以将其称为并行计算。

    因此可以同时运行多个线程(“代码”)。

    当您在 Activity 中时,它在称为 UI-thread 或主线程的线程中运行。所有图形都在该线程中处理,并且仅在该线程中处理。

    永远不要在 UI 线程中等待!

    示例:您有一个按钮,按下它时颜色会从灰色变为黄色。现在你输入一个 Thread.sleep(10000); - 在您的 onClick 开始时等待 10 秒。 然后,您将看到该按钮保持黄色(=按下)10 秒钟,即使您只是很快按下。另外:如果你做得过火,如果用户想强制关闭你的应用程序,android os 会生气并发布消息。

    那么在 handler.postDelayed 上会发生什么?

    Android 会很快打开一个在后台与您的 UI 线程并行运行的线程。所以在几纳秒内它就完成了,并将在 UI 线程中执行下一个命令(在上面的示例中是 Log.d)。在后台,它将等待并计算毫秒,直到时间结束。然后,runnable.run 方法中的任何代码都将在等待后再次在 ui-thread 中执行。

    另请注意:postDelayed 的等待时间不会非常精确,因为通常 ui 线程很忙,当等待时间结束时,它可能还有其他事情要做。您的可运行代码将被添加到队列中,并在 ui-thread 再次准备好时执行。这一切都会发生,而您无需为此做任何事情。

    还有: 请记住在 runnable.run 中使用 try/catch,因为等待时可能会发生很多事情 - 例如,用户可以按下 Home 按钮关闭您的应用程序 - 因此您希望在等待后更改的 ui 元素可能已经被破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2015-03-08
      • 2011-05-03
      • 1970-01-01
      相关资源
      最近更新 更多