Question

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.

Was it helpful?

Solution

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

OTHER TIPS

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

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

}

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top