如何在Android Studio中使用延迟函数?

5

我希望通过蓝牙发送一个字符。当只有单个字符时,代码能够完美运行。但是我想在两个代码之间使用延迟函数。我想输入任何数字与EditText,并且应用程序将获取该数字并执行EditText/44。这就是我希望在两个代码之间等待的时间。

最终成功了..谢谢大家。

我将a、b、c移动到setOnClick内部.. ;

kileri = (Button) findViewById(R.id.kileri);
final EditText value1 = (EditText) findViewById(R.id.textkont);
assert value1 != null;
value1.setText("0");


btAdapter = BluetoothAdapter.getDefaultAdapter();
checkBTState();

kileri.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            int a = Integer.parseInt(value1.getText().toString());
            int b = a / 44;
            int c = b * 1000;

            sendData("F");

            try {
                Thread.sleep(c);

            } catch (Exception e) {
                e.printStackTrace();
            }

我尝试了很多方法,但都失败了。请展示你所尝试的,并描述它们怎么样无法奏效。 - Andy Turner
您是否将大于或等于44的值输入到“value1”中? - Andy Turner
@AndyTurner 是的,我输入了100或200。我有一个Edittext的问题。应用程序无法从中获取数字。当我写入数字而不是“c”时,大多数延迟函数都会起作用。 - R.Sahin Altunbas
6个回答

14
您可以使用处理程序。
new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                //do something
            }
        }, 2000 );//time in milisecond

这是处理程序的首选方式,它专为此而设计。 - N J
它也可以发送字符而无需等待。 - R.Sahin Altunbas
增加时间延迟,比如说15秒或20秒。 - Krishna
如果我输入一个数字,比如3000它可以正常工作,但是当我输入“c”时就不行了。我想等待Edittext/44。我认为我的问题在于Edittext。 - R.Sahin Altunbas
不要写“c”,请告诉我您想等待多少秒? - Krishna
不是常量。我想要一个不同的数字,用Edittext。 - R.Sahin Altunbas

5
 try {
       //set time in mili
        Thread.sleep(3000);

    }catch (Exception e){
        e.printStackTrace();
    }

按照您的代码进行编辑

 kileri.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            sendData("F");
            try {
                //set time in mili
                Thread.sleep(3000);

            }catch (Exception e){
                e.printStackTrace();
            }
            sendData("S");
        }
    });

我在哪里写sendData("S");? - R.Sahin Altunbas
在try catch之后,您可以编写sendData("S"); - Vanraj Ghed
@R.SahinAltunbas 3000 等于 3 秒,您可以根据需要将时间设置为 100/200/300 毫秒。 - Vanraj Ghed
如果我写一个数字像3000,它可以工作,但是当我写'c'时就不能工作。我想等待Edittext/44。 - R.Sahin Altunbas
我在EditText中输入了一个整数。我写了500,但它没有起作用。你能检查一下我的代码吗? - R.Sahin Altunbas
显示剩余4条评论

2

像这样使用处理程序:

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            // do something after 2s = 2000 miliseconds
        }
    }, 2000); //Time in milisecond

它也能工作,但当我写'c'而不是2000时就无法工作。 - R.Sahin Altunbas

0
你可以这样做。
kileri = (Button) findViewById(R.id.kileri);
final EditText value1 = (EditText) findViewById(R.id.textkont);
assert value1 != null;
value1.setText("0");
final int a = Integer.parseInt(value1.getText().toString());
final int b = a/22;
final int c = b/2; // It will take a int from Edittext and do this operation on that.


btAdapter = BluetoothAdapter.getDefaultAdapter();
checkBTState();

kileri.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        sendData("F");
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                sendData("S");    
            }
        }, c);    
    }
});

我尝试了这个,但它会在没有等待的情况下发送字符。 - R.Sahin Altunbas

0

只需要在按钮点击事件中使用runOnUiThread,并在延时后发布Handler即可。

  Button button = new Button(this);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendData("F");                   // send
            delay(2000);
        }
    });

更新

延迟()..

 public void delay(final int c){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(c);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            sendData("S");           //send
        }
    }, c);

}

我想等待c秒。当我写数字时它可以工作,但是当我用'c'代替2000时就不行了。 - R.Sahin Altunbas
对于 delay(2000);,会显示“变量'delay'未被赋值”,“变量'c'在作用域中已经定义”,以及“期望方法调用”。 - R.Sahin Altunbas
终于成功了。我把 int a、b、c 移到 setOnClick 内部,然后就可以工作了。谢谢。 - R.Sahin Altunbas
不客气,我很高兴它起作用了...如果我的回答对你有帮助的话,你可以点赞...这样可以帮助其他遇到同样问题的人... - Iamat8

0

不建议使用Thread.Sleep,因为如果在主线程执行中调用它,它会停止主线程的执行。所以,如果我们想设置延迟,可以使用CountDownTimer

在下面的代码片段中,我们设置了2秒的延迟。因此,在2秒后,onFinish()回调函数会被调用,我们可以在那里执行我们的操作。

new CountDownTimer(2000, 1000) {
     public void onFinish() {
         
     }

 public void onTick(long millisUntilFinished) {
          
 }.start();
} 

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