安卓睡眠/等待/延迟函数

16

首先,我是一个Android初学者,如果有愚蠢的问题请谅解。

我正在尝试做以下事情:

  1. 启用移动数据。
  2. 等待10秒钟。
  3. a. 检查是否移动设备已获取IP地址(数据连接成功)
    b. 如果未连接,则禁用数据
    c. 返回步骤1。

步骤1到3将在用户指定的重试次数中执行。

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

for(retry = UserChoice; retry > 0 && !isDataAvailable ; retry -- ){
     enableInternet()
     delay(10)
     isDataAvailable = GetInternetAvailibility()
     if(!isDataAvailable){ 
         disableInternet()
     }
}
我尝试将 isDataAvailable = GetInternetAvailibility() 语句放在handler的 postDelayed 中,但这会导致 enableInternet()disableInternet()isDataAvailable = GetInternetAvailibility() 延迟执行后同时执行。

从日志中我可以看到,enableInternet() 没有任何延迟地执行了 UserChoice 次。

Thread.sleep(10000) 会使UI冻结10秒钟... 我该怎么做才能实现这个功能呢?

编辑:让我解释一下:

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

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

Before
after
Before
after
Before
after
XXX
XXX
XXX

但是我想要的是:
Before
XXX
After.
Before
XXX
After.
Before
XXX
After.


如果sleep()冻结了您的UI,那么您的代码似乎在“主”线程上运行。尝试在不同的线程上运行代码。 - webuster
4个回答

30

试试这个:

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

这段代码可以用于不同的方式。我已经在我的应用程序中使用它来更改类似Instagram的故事。谢谢。 - Jay

4

1
请尝试以下代码。希望能有所帮助。
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);
    }

}

嗨,Suresh,感谢您提供精确的代码。但是我必须要给viput以荣誉,因为他首先想到了相同的逻辑.. 但还是谢谢你.. 兄弟讲解得很清楚! - ShitalSavekar

0
我尝试将isDataAvailable = GetInternetAvailibility()语句放在handler的postDelayed中,但这会导致enableInternet()和disableInternet()同时执行,而isDataAvailable = GetInternetAvailibility()则会在延迟后执行。
将if语句和disableInternet()放在postDelayed中。enableInternet将被调用,10秒后它将检查互联网是否可用,如果不可用,则会disableInternet。

我也尝试过这样做...但由于for循环的缘故,enableInternet()会同时执行5次。当for循环完成处理后,postDelayed语句才会被执行。 - ShitalSavekar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接