web-dev-qa-db-ja.com

Android Sleep / Wait / Delay関数

まず第一に、私はAndroid worldの初心者なので、それが愚かな質問である場合は謝罪してください。

私は次のことをしようとしています:

  1. モバイルデータを有効にする
  2. 10秒待ちます
  3. a。モバイルがIPアドレスを取得したかどうかを確認します(データが正常に接続されました)
    b。接続されていない場合、データを無効にします
    c。ステップ1に進みます

そして、これらのステップ1から3は、ユーザー指定の再試行回数のForループで実行されています。

今、私の問題は次のとおりです。ステップ2で立ち往生しています。
waitfor(int seconds)関数を作成できません。 Runnable PostDelayedメソッドを使用してみましたが、必要な出力が得られません。

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

ハンドラーのpostDelayedisDataAvailable = GetInternetAvailibility()ステートメントを配置しようとしましたが、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が次のようにメッセージを出力するログを確認できます。







XXX
XXX
XXX

でも私はしたい:

XXX
後。

XXX
後。

XXX
後。

15
ShitalSavekar

これを試して:

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

この方法はあなたを助けるかもしれません。

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

以下のコードを試してみてください。

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

}
1
suresh

ハンドラーのpostDelayedにisDataAvailable = GetInternetAvailibility()ステートメントを入れようとしましたが、isDataAvailable = GetInternetAvailibility()が遅延後に実行されている間にenableInternet()disableInternet()が同時に実行されています。

IfステートメントとdisableInternet()をpostDelayedに入れます。 enableInternetが呼び出され、10秒後にインターネットが利用可能かどうかを確認し、利用可能でない場合は無効にします。

0
FunkTheMonk