Nano Hash - криптовалюты, майнинг, программирование

Потоки Android и обработчик не работают

Недавно я провел рефакторинг старого проекта и обнаружил, что какая-то его часть больше не хочет работать должным образом, независимо от того, что я делаю. По сути, у меня есть 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, поэтому любые указатели будут весьма кстати.


Ответы:


1

Вы создаете обработчик статически, который создает его в потоке загрузчика. Создайте обработчик в onCreate(), и он будет привязан к потоку пользовательского интерфейса и решит вашу проблему. Также вместо Thread.sleep можно сделать handler.sendEmptyMessageDelayed всякий раз, когда вы получаете сообщение, и просто отправьте начальное сообщение, чтобы начать работу. Я думаю, что Thread.sleep в обработчике может заблокировать поток.

25.11.2012
  • Спасибо! Это решило исключение, но у меня все еще есть проблемы с его паузой. Я не хочу отправлять пустое сообщение, а сообщение с прикрепленной строкой, которое будет отображаться. Теперь это работает, но, как вы сказали, Thread.sleep работает не так, как хотелось бы. Есть несколько циклов, в которых используется обработчик, и он должен запускаться примерно дюжину раз. Все, что я получаю, это первая строка, затем она сразу же перемещается, в то время как этот поток продолжает работать в фоновом режиме, хотя делать нечего. Это или он сбрасывает все и сразу идет дальше. 25.11.2012
  • Ах, неважно. У меня сейчас работает. Я понял, что мне нужно поместить метод, который запускает финальные проверки и определяет, куда идти, в методе run(), а не в основном потоке. 25.11.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..