Android Sleep/Wait/Delay function

2019-01-24 03:36发布

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

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

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

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.

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

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.

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

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

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.

4条回答
干净又极端
2楼-- · 2019-01-24 04:21

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.

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.

查看更多
霸刀☆藐视天下
3楼-- · 2019-01-24 04:27

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);
        }
    }
}
查看更多
时光不老,我们不散
4楼-- · 2019-01-24 04:29

This way may help you.

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();
查看更多
Fickle 薄情
5楼-- · 2019-01-24 04:32

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);
    }

}
查看更多
登录 后发表回答