Я не знаю, является ли использование Потоки практикой для того, чего я пытаюсь достичь, поэтому, пожалуйста, не стесняйтесь вносить изменения в код, где хотите.
Я пытаюсь реализовать функцию в своем приложении, где TextView
переключается на 1 значение, а затем возвращается к исходному значению каждые 5 секунд. Я реализовал следующее использование в потоке:
layoutDate.setText(firstNumber);
Thread numberSwitch = new Thread() {
@Override
public void run() {
while(!isInterrupted()) {
try {
Thread.sleep(5000);
runOnUiThread(new Runnable () {
@Override
public void run() {
layoutDate.setText(secondNumber);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
numberSwitch.start();
Я пытался добавить layoutDate.setText(firstNumber)
сразу после runUiOnThread
, а также после вложенного run
, но это все равно не работает, как я хочу.
Я хочу добиться чего-то вроде следующего:
Что делает код в текущем состоянии?
@РикардоА. поэтому onCreate
устанавливается layoutDate.setText(firstNumber)
, а затем через 5 секунд устанавливается layoutDate.setText(secondNumber)
. Проблема в том, что он не возвращается к первому числу, независимо от того, где я добавляю layoutDate.setText(firstNumber)
в потоке.
Не понял. Он создает его и устанавливает начальное значение, через 5 секунд устанавливает второе значение. Когда вы хотите, чтобы он вернулся к первому? Еще через 5 секунд?
@РикардоА. Ага - это точно. 1. onCreate установить firstValue 2. Подождать 5 секунд 3. Установить secondValue 4. Подождать 5 секунд 5. setFirstValue
Проверьте текущий номер, который находится в поле, и измените его на другой, вы можете сделать это, получив значение layoutDate.getText().toString()
или используя новую переменную для хранения значения.
layoutDate.setText(firstNumber);
Thread numberSwitch = new Thread() {
@Override
public void run() {
while(!isInterrupted()) {
try {
Thread.sleep(5000);
runOnUiThread(new Runnable () {
@Override
public void run() {
if (currentNumber == firstNumber){
currentNumber = secondNumber;
}else{
currentNumber = firstNumber;
}
layoutDate.setText(currentNumber);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
numberSwitch.start();
Или
if (layoutDate.getText().toString().equals(firstNumber+"")){
layoutDate.set(secondNumber);
}else{
layoutDate.set(firstNumber);
}
Лучшим способом может быть публикация исполняемого файла с использованием лямбда-выражений в самой layoutDate вместо использования нового обработчика или нового потока. Таким образом, runnable будет очищен, как только представление станет недействительным.
Вы можете использовать Handler с runnable.
private TextView textView;
private Handler handler;
в вашем onCreate()
textView = findViewById(R.id.tv_bt_msg);
textView.setText("secondNumber");
handler = new Handler();
//Change the textview after 5 seconds
handler.postDelayed(runnable, 5000);
Runnable для изменения текста каждые 5 секунд
private Runnable runnable = new Runnable() {
@Override
public void run() {
String currentString = textView.getText().toString();
if (currentString.equals("secondNumber")){
currentString = "firstNumber";
}else{
currentString = "secondNumber";
}
final String tempString = currentString;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(tempString);
}
});
//Change the textview again after 5 seconds
handler.postDelayed(runnable, 5000);
}
};
Используйте это, чтобы удалить обратные вызовы
handler.removeCallbacks(runnable);
Это сработало блестяще @Arun. У меня небольшая проблема с цветом textView
. При настройке secondNumber
я установил изменение цвета. Можно ли вернуть цвет обратно к исходному, когда он снова переключается на firstNumber
, используя вашу реализацию выше?
@Adam Меняйте цвет текста каждый раз, когда меняете текст. Наряду с textView.setText()
добавьте textView.setTextColor()
и установите цвет, который вы хотите для этого текста. Здесь — это ответ с различными вариантами изменения цвета текста во время выполнения.
Сделанный. :D Я только что позвонил textView.setTextColor()
в if else
. Спасибо :)
Вместо этого используйте обработчик