Android 睡眠/等待/延迟功能

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21380951/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:27:52  来源:igfitidea点击:

Android Sleep/Wait/Delay function

androiddelaysleepthread-sleep

提问by ShitalSavekar

first of all, I'm a beginner to android world so please apologize me if it is stupid question..

首先,我是 android 世界的初学者,所以如果这是一个愚蠢的问题,请向我道歉..

I'm trying to do following:

我正在尝试执行以下操作:

  1. Enable Mobile Data
  2. Wait for 10 seconds
  3. a. check if Mobile got IP address (data connected sucessfully)
    b. if Not connected,Disable Data
    c. Go to step 1
  1. 启用移动数据
  2. 等待 10 秒
  3. 一种。检查 Mobile 是否获得 IP 地址(数据连接成功)
    b. 如果未连接,则禁用数据
    c. 转到步骤 1

And these steps 1 to 3 are getting executed in For loop for User Given number of retries.

这些步骤 1 到 3 将在 For 循环中针对用户给定的重试次数执行。

Now my problem is: I'm stuck at step No. 2.
I'm unable to make waitfor(int seconds)function. I tried using Runnable PostDelayed method but it is not giving me required output.

现在我的问题是:我卡在第 2 步。
我无法发挥waitfor(int seconds)作用。我尝试使用 Runnable PostDelayed 方法,但它没有给我所需的输出。

for(retry = UserChoice; retry > 0 && !isDataAvailable ; retry -- ){
     enableInternet()
     delay(10)
     isDataAvailable = GetInternetAvailibility()
     if(!isDataAvailable){ 
         disableInternet()
     }
}

I tried to put isDataAvailable = GetInternetAvailibility()statement in postDelayedof handler but it is causing enableInternet()disableInternet()to execute at the same time while isDataAvailable = GetInternetAvailibility()gets executed after delay.

我试图将isDataAvailable = GetInternetAvailibility()语句放入postDelayed处理程序中,但它导致在延迟后执行enableInternet()disableInternet()时同时isDataAvailable = GetInternetAvailibility()执行。

I can see from logs, that enableInternet()executes for UserChoicenumber of times without any delay.

我可以从日志中看到,它毫无延迟地enableInternet()执行了UserChoice多次。

Thread.sleep(10000) just freezes the UI for 10 seconds... How do I achieve this?

Thread.sleep(10000) 只是将 UI 冻结 10 秒......我该如何实现?

EDIT : Let me clear :

编辑:让我清楚:

public void onClick(View v) {
     // Perform action on click
    for(i=0; i<3; i++ ){
        System.out.println("Before..");
        delay(5);
        System.out.println("after..");
    }
}

public void delay(int seconds){
    milliseconds = seconds * 1000;
    runOnUiThread(new Runnable() {
             @Override
             public void run() {
                  final Handler handler = new Handler();
                  handler.postDelayed(new Runnable() {
                       @Override
                       public void run() {
                           System.out.println("XXX");                 //add your code here
                       }
                  }, milliseconds);
             }
      });
}

Now whenever I click button I can see in logs that System.out prints message as:

Before
after
Before
after
Before
after
XXX
XXX
XXX

But I want:
Before
XXX
After.
Before
XXX
After.
Before
XXX
After.

现在,每当我单击按钮时,我都可以在日志中看到 System.out 打印消息为:

Before
after
Before
after
Before
after
XXX
XXX
XXX

但我想要:
Before
XXX
After。

XXX之前


XXX之前

回答by vipul mittal

try this:

尝试这个:

public void check() {
    isDataAvailable = GetInternetAvailibility()
    if (!isDataAvailable) {
        disableInternet();
        enableInternet();
        if (retry > 0) {
            retry--;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    check();
                }
            }, 10000);
        }
    }
}

回答by Xplosive

This way may help you.

这个方法可以帮到你。

http://developer.android.com/reference/android/os/CountDownTimer.html

http://developer.android.com/reference/android/os/CountDownTimer.html

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
}.start();

回答by suresh

Try Below code.Hope that it will help

试试下面的代码。希望它会有所帮助

int i = 0;
int j = 3;

method() {
    if (i < j) {
        System.out.println("Before..");
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                System.out.println("XXXXXX");

                i++;
                System.out.println("after");
                method();
            }
        }, 1000);
    }

}

回答by FunkTheMonk

I tried to put isDataAvailable = GetInternetAvailibility() statement in postDelayed of handler but it is causing enableInternet() disableInternet() to execute at the same time while isDataAvailable = GetInternetAvailibility() gets executed after delay.

我试图将 isDataAvailable = GetInternetAvailibility() 语句放在处理程序的 postDelayed 中,但它导致 enableInternet() disableInternet() 同时执行,而 isDataAvailable = GetInternetAvailibility() 在延迟后执行。

Put the if statement and disableInternet() in the postDelayed. enableInternet will get called, 10 seconds later it will check to see if the internet is available, if not it will disableInternet.

将 if 语句和 disableInternet() 放在 postDelayed 中。enableInternet 将被调用,10 秒后它会检查 Internet 是否可用,如果不可用,它将禁用 Internet。