Android postDelayed不会延迟

时间:2015-02-15 17:09:53

标签: android

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

基本上我希望我的程序在单击按钮后等待一秒钟,然后在我的textview上更新文本(" READY"),再等2秒,然后再次更新textview(&# 34; 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");
    }
};

BUT: 如果我想在每秒后刷新Textview上的文本,我该怎么做?我不能多次调用mHandler.postDelayed()..感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

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

请勿在UI线程中等待!

示例:您有一个按钮,按下该按钮可以将颜色从灰色切换为黄色。现在您输入Thread.sleep(10000); -在onClick开始时等待10秒钟。 然后,您将看到按钮保持黄色(=按下)10秒钟,即使您只是非常短地按下也是如此。另外:如果操作过度,Android os会生气,并在用户要强制关闭您的应用程序时将其发布。

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

Android将非常快速地打开一个在后台与您的UI线程并行运行的线程。因此,它已经完成了几纳秒,并且将在UI线程中执行下一个命令(在上面的示例中是Log.d)。在后台,它将等待并计数毫秒,直到时间到了。然后,等待之后,将再次在ui线程中执行runnable.run方法内部的任何代码。

还请注意:postDelayed在等待时间上不会非常精确,因为通常ui线程非常忙碌,等待时间到时可能还有其他事情要做。您的可运行代码将添加到队列中,并在ui-thread再次准备就绪时执行。这一切都发生在您不需要做任何事情的情况下。

也: 记住要在runnable.run内部使用try / catch进行操作,因为在等待期间可能发生许多事情-例如用户可以按下Home按钮关闭您的应用程序-这样,您希望在等待之后更改的ui元素可能已被破坏。