从runnable上的循环退出并移动到下一个屏幕

时间:2016-04-26 18:55:36

标签: java android multithreading

我几乎是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");
    }

}

1 个答案:

答案 0 :(得分:0)

首先,您需要了解postDelayed()的确切运作方式。

当您将runnable分配给Handler's postDelayed()时,这意味着您正在安排任务以从当前时间开始以特定时间间隔执行。 现在你正在做的是运行一个while循环29次,每次调度任务 - 总共29个任务分别在3,6,9 ......秒运行。 此时您只安排了任务,但尚未开始运行。 而你循环完成后迭代29次。 你的rangeofRouter0()永远不会在while循环迭代期间被调用,因为它只花了几毫秒,因此counter永远不会大于0。

注意 - 如果您希望循环运行30次,则应将其更改为while (i<=30)

所以,你需要改变你的逻辑来实现你想要的。如果您想了解更多关于Handler的信息。检查this