Недавно я провел рефакторинг старого проекта и обнаружил, что какая-то его часть больше не хочет работать должным образом, независимо от того, что я делаю. По сути, у меня есть Activity с TextView. Это представление обновляется через определенные промежутки времени из потока, вызываемого в том же классе. Пауза выполняется с помощью Thread.sleep, а обработчик используется для запуска обновления пользовательского интерфейса. Дело в том, что теперь я либо получаю исключение CalledFromWrongThreadException, говорящее, что я не могу манипулировать представлением из другого потока, либо длинная пауза, после которой весь текст сразу попадает в представление, либо оно, по-видимому, немедленно срабатывает и не спит вообще. Раньше я делал это так (соответствующие части включены):
public class Updated extends Activity implements Runnable {
private TextView textView;
private String text;
private Handler handle = new Handler(){
@Override
public void handleMessage(Message msg){
textView.append(text);
}
};
//onCreate and other such things...{
new Thread(this).start();
}
public void run(){
//A healthy chunk of logic/conditionals
text = "Blah blah";
handle.sendEmtpyMessage(0);
try {
Thread.sleep(1500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Это суть того, что я использовал ранее, и это работало нормально. Тем не менее, мне действительно не нравилась практика установки переменной класса, а затем ее последующего захвата обработчиком. Я изменил его, чтобы передать сообщение с полем .obj, установленным в строку, которая затем будет очищена и добавлена в TextView. Это взорвется с вышеупомянутым исключением. Я попытался оставить объявление обработчика на месте, но переместил логику в другой метод, где обработчик будет .post(Runnable(){}); с теми же внутренностями, но это просто остановит и добавит его после значительного ожидания. Я не очень хорошо разбираюсь во внутренней работе обработчиков и потоков в Java/Android, поэтому любые указатели будут весьма кстати.