2012-12-12 4 views
-1

Название в значительной степени объясняет проблему.Перезапуск завершенной темы приводит к сбою (Android SDK)

У меня есть кнопка, когда я нажимаю кнопки включения/выключения этой темы. Он успешно включается и выключается ... один раз, затем он падает, если я пытаюсь включить его снова.

private Thread dataThread = new Thread(new Runnable(){ 
    public void run() { 
     while(transmitPackets){ 
       Log.d("Test","DERP"); 
     } 
    } 
}); 

и где его запустить ...

toggleButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v){ 
      transmitPackets = !transmitPackets; 
      if(transmitPackets) { 
       toggleButton.setText("Pause"); 
       dataThread.start(); 
      } 
      else { 
       toggleButton.setText("Transmit"); 
      } 
     } 
    }); 

transmitPackets является булево переключены с помощью кнопки. Названо как таковое, потому что это приложение в конечном итоге будет отправлять данные по сети. Поток также использует его для завершения.

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

Я новичок в Android SDK и потоковом в Java, поэтому я не знаю, где я могу ошибиться. Кажется, это самая простая реализация потока, который я начинаю, прежде чем попытаюсь сделать что-то напуганное с потоком.

ответ

1

Вам нужно будет переместить код DataThread в код setOnClickListener, так как вы создаете только один поток, поэтому, когда вы снова начинаете его, он не может, как это делается.Вы должны объявить DataThread, где вы делаете сейчас, но установить его в слушателе

2

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

Действительно. Вы не можете запустить нить, которая уже завершена. Вам нужно будет создать новый поток и начать это.

Обратите внимание, что информация, которую вы не можете перезапустить нить, которая уже начала должно было быть ясно, из:

  • Трассировка стека
  • documentation:

    Throws IllegalThreadStateException если резьба была начата до

Когда что-то вызывает исключение, вы должны всегда читать сообщение об исключении (и трассировать трассировку, поскольку там может быть причинно-следственная информация) и документации.

+0

Каждый ответ здесь получил, спасибо, ребята! Я просто создал поток в OnClickListener, и он работает красиво. Для чего это стоит, это исключение не содержится в трассировке стека, вызванной сбоем. Я ценю помощь в любом случае. – Wuzseen

+2

@Wuzseen: Ну, что же делает * трассировка стека? Вы должны сделать шаг назад и проанализировать, почему вы не смогли сами диагностировать это. Вы говорите, что трассировка стека «не особенно полезна», но, возможно, если бы вы действительно скопировали ее в свой вопрос, мы могли бы помочь вам понять, как она * полезна ... –

2

Как только нить завершена, ее исчезли. Вы не можете перезапустить. Возможно, вам понадобится создать новый поток. Без трассировки стека трудно ничего предложить.

вызов start() в потоке не означает, что вы перезапускаете нить. Это означает, что вы начинаете новую тему.

Проблема может быть чем-то еще. Трассировка столбца стека.

0

Лучше реализация будет

private Thread dataThread = new Thread(new Runnable(){ 
public void run() { 
    while(true){ 

    if(transmitPackets){ 
     Log.d("Test","DERP"); 
     transmitPackets = false; 
    } 
    } 
} 
}); 

таким образом поток продолжает идти, и вы все это значение истина изменения из transmitPackets так что он будет работать

+0

За исключением того, что вы должны создать новый поток для удерживайте этот dataThread Thread, так что он вообще не запускается в потоке графического интерфейса. Я предлагаю новый класс, и таким образом вы можете вызвать метод передачиData(), и этот класс будет устанавливать передающие пакеты в true – dannyRods

+0

. И это также означает, что до тех пор, пока ваше приложение работает, устройство не будет спать, даже если экран выключен или у вас 'передачаPackets' как ложная; Использование ЦП также привязывается. Пустые вращающиеся петли все еще едят циклы –

+0

показалось легче объяснить, потому что он новичок в sdk, а не пытается объяснить AsyncTask. – dannyRods

Смежные вопросы