Изменение внешней переменной runnable, выполняемой периодически на Java - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь выполнять на Android каждые пять секунд Runnable, который должен вставлять эти значения в базу данных:

value | seconds delayed
  1            0
  2            5
  3            10
  4            15
  3            20
  2            25
  1            30

Мой подход был следующим:

public class MainActivity extends AppCompatActivity{
    public static int currentValue;
    public static int directionSign;

    protected void onCreate(Bundle savedInstanceState) {
        generateData();
    }

    public void generateData(){

        currentValue = 1;
        int directionSign = 1;

        while(!(directionSign == -1 && currentValue == 0)){

            Handler handler=new Handler();
            Runnable r=new Runnable() {
                public void run() {
                    long currentTimestamp = System.currentTimeMillis();
                    db.insertValue(currentTimestamp, currentValue);
                }
            };

            //Insert two registers for each state
            for(int i=0; i<2; i++) {
                handler.postDelayed(r, 5000);
            }

            if(currentValue == 4){
                directionSign = -1;
            }

            currentValue+= directionSign;


        }

        handler.postDelayed(r, Constants.MEASUREMENT_FREQUENCY);

    }
}

Однако этот код застревает на value 1. У меня вопрос: как мне это сделать, чтобы он сгенерировал вывод, показанный в таблице?

1 Ответ

1 голос
/ 10 июля 2020

Поскольку ваш while l oop повторяется 7 раз и вы создаете 14 потоков, все потоки будут выполняться сразу через 5 секунд, а не КАЖДЫЕ 5 секунд. Таким образом, для вашего варианта использования вы можете создать только один поток, который записывает в базу данных каждые 5 секунд:

new Thread(new Runnable() {
            public void run() {
                int currentValue = 1;
                int directionSign = 1;
                while(!(directionSign == -1 && currentValue == 0)) {
                    long currentTimestamp = System.currentTimeMillis();
                    db.insertValue(currentTimestamp, currentValue);
                    if(currentValue == 4){
                        directionSign = -1;
                    }
                    currentValue+= directionSign;
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();;
...