Урок 3 : Заканчиваем алгоритм работы

Приложение "Светофор" Часть 3 Дописываем алгоритм работы

Приступаем к 3-й заключительной части урока “Светофор“. Начнем с того что нам нужно будет сделать что бы при нажатии на кнопку “Start” цикл запускался и надпись на кнопки изменялась на “Stop“, таким образом нам не придется использовать вторую кнопку для остановки цикла. Сначала мы создадим текстовый ресурс “Start” и “Stop” в файле strings.xml , который находиться в “res/values/strings.xml“.

Он должен выглядеть так:

<resources>
    <string name="app_name">TrafficLight</string>
    <string name="start">Start</string>
    <string name="stop">Stop</string>
</resources>
В кавычках после слова name находиться идентификатор по которому мы будем находить наш текстовый ресурс, идентификатор может быть любое слово латинскими буквами, главное что бы не было пробелов,а в треугольных скобках сам ресурс">Start<", это может быть любой текст

Теперь дописываем алгоритм работы. Самое первое что нам нужно сделать это убедится что мы не создаем несколько потоков. Если мы запустим код написанный до этого момента то при каждом нажатии на кнопку будет создаваться новый поток и новый цикл. Чтобы этого избежать мы создадим условие “if” которое будет проверять цикл уже запущен или нет. Если цикл еще не запущен то мы создаем новый поток, меняем текст на кнопке на “Stop”  и запускаем цикл, а если цикл уже запущен то мы останавливаем цикл и меняем текст на кнопке на “Start“, и возвращаем первоначальный цвет лампочек. Мы сделаем это с помощью переменной “booleanstart_top. Изначально эта переменная равна “false“, мы проверяем если переменная start_stop равна “false” значит цикл еще не запущен, если же переменная равна “true” значит цикл запущен. Таким образом у нас получится следующий код, в слушатели на нажатие onClickStart():

public void onClickStart(View view)
    {
        if(!start_stop){
            start_stop = true;
        new Thread(new Runnable() {
            @Override
            public void run() {
while (start_stop)
{
}
}
}).start();
}
else
 {
b.setText(getString(R.string.start));
start_stop = false;
b_1.setBackgroundColor(getResources().getColor(R.color.green));
b_2.setBackgroundColor(getResources().getColor(R.color.grey));
b_3.setBackgroundColor(getResources().getColor(R.color.grey));
} 
}

Теперь при нажатии на кнопку если переменная start_stop равна true мы просто присваиваем данной переменной значение false это остановит цикл, если же переменная start_stop равна false то мы присваиваем этой переменной значение true и запускаем новый поток и цикл. Таким образом мы убеждаемся что у нас при нажатии на кнопку старт создается только один поток и цикл.

Далее нам нужно сделать так что бы цикл повторялся с частотой в 1 сек. Цикл по умолчанию повторяется с очень большой скоростью а нам это не нужно. Для замедления цикла мы используем функцию “sleep” у класса Thread. Таким образом: Thread.sleep(1000);  время “засыпания” потока пишется в миллисекундах 1 секунда = 1000 миллисекунд. Мы напишем данную линию кода внутри цикла, и таким образом цикл дойдя до этой строчки будет засыпать на 1 сек. Теперь у нас есть цикл который повторяется с частотой в 1 сек, мы можем начинать считать! Например мы можем считать до 9-ти, тогда каждые 3 сек мы будем изменять цвет лампочек. Например: У нас по умолчанию у светофора зеленый свет, счетчик считает до 3 и загорается желтый цвет, далее когда счетчик досчитает до 6-ти загорится красный свет, далее когда счетчик досчитает до 9-ти загорится снова зеленый свет, счетчик сбросится на “0” и процесс повторится пока мы его не остановим нажатием кнопки “Stop“. Для того чтобы считать от “0” до “9” мы создадим новую переменную  “int counter = 0;” добавим ее в наш цикл для счета. “counter++;“. Два плюса после переменной означают что при каждом цикле значение переменной будет увеличиваться на “1”, вот и счетчик готов! Теперь нам нужно поставить переключатель который будет следить за счетчиком и включать нужный цвет. Для этого мы используем переключатель “switch” мы передаем переменную “counter” в данный переключатель и он будет сравнивать значение данной переменной со значением “case” которое мы напишем. 

 import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
LinearLayout b_1, b_2, b_3;
private boolean start_stop = false;
private int counter = 0;
private Button b;
@Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b_1 = findViewById(R.id.bulb_1);
b_2 = findViewById(R.id.bulb_2);
b_3 = findViewById(R.id.bulb_3);
b = findViewById(R.id.button1);
b_1.setBackgroundColor(getResources().getColor(R.color.green));
b_2.setBackgroundColor(getResources().getColor(R.color.grey));
b_3.setBackgroundColor(getResources().getColor(R.color.grey));
}

public void onClickStart(View view)
{
//Проверяем значение переменной start_stop
 if(!start_stop){
b.setText(getString(R.string.stop));
start_stop = true;
//Создаем новый поток
 new Thread(new Runnable() {
@Override
 public void run() {
//Запускаем цикл
while (start_stop)
{
//Счетчик циклов
 counter++;
//Переключатель цвета
 switch (counter)
{
case 3:
b_1.setBackgroundColor(getResources().getColor(R.color.grey));
b_2.setBackgroundColor(getResources().getColor(R.color.yellow));
b_3.setBackgroundColor(getResources().getColor(R.color.grey));
break;
case 6:
b_1.setBackgroundColor(getResources().getColor(R.color.grey));
b_2.setBackgroundColor(getResources().getColor(R.color.grey));
b_3.setBackgroundColor(getResources().getColor(R.color.red));
break;
case 9:
b_1.setBackgroundColor(getResources().getColor(R.color.green));
b_2.setBackgroundColor(getResources().getColor(R.color.grey));
b_3.setBackgroundColor(getResources().getColor(R.color.grey));
//Сбрасываем счетчик на "0"
 counter = 0;
break;
}
//try это исключение о котором мы еще поговорим, пока просто пишем как есть
 try {
//"Усыпляем" поток на 1 сек
 Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
else
 {
b.setText(getString(R.string.start));
start_stop = false;
b_1.setBackgroundColor(getResources().getColor(R.color.green));
b_2.setBackgroundColor(getResources().getColor(R.color.grey));
b_3.setBackgroundColor(getResources().getColor(R.color.grey));
counter = 0;

}
}

@Override
 protected void onDestroy() {
super.onDestroy();
//Останавливаем цикл
 start_stop = false;
}
}

Когда одно из значений совпадет данный “case” запустит наш код и включит нужный цвет выбрав цвет фона нашего квадрата. Вот и все, наш светофор готов!! 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *