首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android postDelayed不会延迟

Android postDelayed不会延迟
EN

Stack Overflow用户
提问于 2015-02-15 17:09:52
回答 2查看 3.1K关注 0票数 1

我的问题是,如果我使用postDelayed方法,我的安卓应用程序不会延迟一秒钟(或10秒)。

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

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

我做错什么了?

这是我的代码:

代码语言:javascript
复制
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()),然后运行循环并等待几秒钟.

代码语言:javascript
复制
                    runOnUiThread(new Runnable() {

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

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

谢谢你的帮助!

编辑:我现在能够找到我的第一个问题的解决方案。在这篇文章中,“疯狂”的回答帮助了我:How to start a different activity with some delay after pressing a button in android? (这可能和@laalto试图告诉我的一样。谢谢你的暗示!)

onClick()

代码语言:javascript
复制
            tv1.setText("READY");
            mHandler.postDelayed(mDelay1, 2000);

然后是可跑的

代码语言:javascript
复制
    private Runnable mDelay1 = new Runnable() {
    @Override
    public void run() {
        if (tv1.getText()=="READY")
            tv1.setText("SET");
    }
};

但是:如果我想在每一秒之后刷新我的Textview上的文本,我如何做到这一点?我不能只打几次电话给mHandler.postDelayed()。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-15 17:12:37

当您调用postDelayed()时,它只是将Runnable放在一个队列中并立即返回。它不会等待可运行的执行。

如果您需要在延迟之后发生一些事情,请将代码放在runnable的run()方法中。

票数 2
EN

Stack Overflow用户

发布于 2020-04-23 16:25:49

每当你调用像Thread.start(),handler.postDelayed,view.postDelayed,AsynchTask,TimerTask之类的东西。你进入了线程的世界,或者你可以称之为并行计算。

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

当您在活动中时,它运行在一个线程中,即calld、、UI线程、或主线程。所有图形都是在该线程中处理的,而该线程则是单独处理的。

从不在UI线程中等待!

例子:你有一个按钮,按下它时,颜色从灰色切换到黄色。现在输入一个Thread.sleep(10000);-在onClick开始时等待10秒。然后,您将看到按钮保持黄色(=按下)10秒,即使您只按了很短的时间。另外:如果你做得太过火了,android操作系统会生气,如果用户想强行关闭你的应用程序,他会发帖。

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

Android将非常迅速地打开一个运行在与UI线程并行的后台的线程。因此,在几纳秒内,它已经这样做了,并将在UI线程中执行下一个命令(在上面的示例中是Log.d)。在后台,它将等待和计数米利斯,直到时间结束。然后,在等待之后,runnable.run方法中的任何代码都将再次在ui线程中执行。

还要注意: postDelayed对于等待时间并不是非常精确,因为通常ui线程是相当复杂的,当等待时间结束时,它可能还有其他的事情要做。您的可运行代码将添加到队列中,并在ui线程再次准备就绪时执行。所有这一切都发生在你没有做任何事情的情况下。

另外:请记住,在runnable.run中使用try/catch,因为等待时可能会发生许多事情--例如,用户可以按Home按钮关闭应用程序--这样,在等待被销毁后,您想要更改的ui元素就会发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28528692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档