我几乎是android的初学者。我有点陷入困境。在下面的代码中,我运行一个while循环30次,runnable post delay是3秒,表示循环将运行90秒(这还不重要)。它这样做,那很好。但是在runnable中,当我调用rangeofRouter0()函数时,当它进入rangeofRouter0()函数的“else if”条件时,textView中的值变为“你已经到达转弯”,并且它必须删除定义的回调和移动到下一个活动,从while循环退出,无论它是否已经完成90秒但是程序没有达到if(textView.getText.equals ....)部分。如果我将此条件直接置于“else if”中,则回调(我认为)不会被删除,并且会一次又一次地调用下一个屏幕。我希望当代码进入其他时,它应该只是移动到下一个屏幕和之前的活动(意味着这个活动),应该只是被遗忘
int i = 1;
while (i<30)
{
myRunnable =new Runnable() {
public void run() {
scanWifiList();
rangeofRouter0();
}
};
handler1.postDelayed(myRunnable, i * 3000);
i++;
if(textView.getText().toString.equals("You have reached the turn")){
///this text gets in textView in "else if" condition
handler1.removeCallbacks(myRunnable);
Intent intent = new Intent(getApplicationContext(), FrontScreen.class);
// finish();
startActivity(intent);
break;
}
}//While loop ended
private void scanWifiList() {
mainWifi.startScan();
wifiList = mainWifi.getScanResults();
textView5.setText("" + firstRouterDistance());
}
public void rangeofRouter0(){
if(firstRouterDistance() >= 30 &&
firstRouterDistance() <= 70 && ((degree>0 && degree <60)||(degree>300 && degree <360)))
{
textView.setText("Move left");
speakOut(textView.getText().toString());
}
else if(firstRouterDistance() >= 3 &&
firstRouterDistance() <= 20 &&
secondRouterDistance() >= 7 &&
secondRouterDistance() <= 60 && degree>220 && degree <250)
{
textView.setText("You have reached the turn");
counter++;
}
else{
textView.setText("Not before dining hall");
}
}
答案 0 :(得分:0)
首先,您需要了解postDelayed()
的确切运作方式。
当您将runnable分配给Handler's postDelayed()
时,这意味着您正在安排任务以从当前时间开始以特定时间间隔执行。
现在你正在做的是运行一个while循环29次,每次调度任务 - 总共29个任务分别在3,6,9 ......秒运行。
此时您只安排了任务,但尚未开始运行。
而你循环完成后迭代29次。
你的rangeofRouter0()
永远不会在while循环迭代期间被调用,因为它只花了几毫秒,因此counter
永远不会大于0。
注意 - 如果您希望循环运行30次,则应将其更改为while (i<=30)
。
所以,你需要改变你的逻辑来实现你想要的。如果您想了解更多关于Handler
的信息。检查this。