Где остановиться/уничтожить потоки в Классе обслуживания Android?

Какой модуль вы пытались импортировать из nltk? После импорта nltk попробуйте загрузить этот модуль самостоятельно, используя nltk.download («модуль»)

38
задан Eng.Fouad 28 February 2013 в 00:16
поделиться

2 ответа

Приложение: платформа Android предоставляет многим помощникам для одноразовой работы, фоновой работы, и т.д., который может быть предпочтителен по попытке для потока самокрутки во многих экземплярах. Как упомянуто в ниже сообщения, AsyncTask является хорошей начальной точкой для изучения. Я поощряю читателей изучать условия платформы сначала перед ровным началом думать о выполнении их собственной поточной обработки.

Существует несколько проблем в примере кода, который Вы отправили, я обращусь в порядке:

1) Thread.stop () был удержан от использования в течение достаточно долгого времени теперь, когда он может оставить зависимые переменные в непоследовательных состояниях при некоторых обстоятельствах. Дополнительную информацию см. в этой странице ответа Sun (Редактирование: та ссылка является теперь битой, посмотрите эту страницу для того, почему не использовать Thread.stop ()). Предпочтительный метод остановки и запуска потока следующим образом (предполагающий, что Ваш поток будет работать несколько неограниченно долго):

private volatile Thread runner;

public synchronized void startThread(){
  if(runner == null){
    runner = new Thread(this);
    runner.start();
  }
}

public synchronized void stopThread(){
  if(runner != null){
    Thread moribund = runner;
    runner = null;
    moribund.interrupt();
  }
}

public void run(){
  while(Thread.currentThread() == runner){
    //do stuff which can be interrupted if necessary
  }
}

Это - всего один пример того, как остановить поток, но еда на дом - то, что Вы ответственны за выход из потока так же, как Вы были бы любой другой метод. Поддержите метод перекрестного потока communcation (в этом случае энергозависимая переменная, мог также быть через взаимное исключение, и т.д.), и в Вашей логике потока, используйте тот метод коммуникации, чтобы проверить, необходимо ли рано выйти, очистка, и т.д.

2) К Вашему измерительному списку получают доступ несколько потоков (поток события и Ваш пользовательский поток) одновременно без любой синхронизации. Похоже, что Вы не имеете к синхронизации самокрутки, можно использовать BlockingQueue.

3) Вы создаете новый Сокет каждое повторение Вашего Потока отправки. Это - довольно тяжелая операция, и только действительно имейте смысл, если Вы ожидаете, что измерения будут чрезвычайно нечастыми (скажите один час или меньше). Или Вы хотите персистентный сокет, который не воссоздается каждый цикл потока, или Вы хотите выстрел того, выполнимый, можно 'запустить и забыть', который создает сокет, отправляет все соответствующие данные и концы. (Быстрое примечание об использовании персистентного Сокета, методы сокета, какой блок, такой как чтение, не может быть прерван Thread.interrupt (), и поэтому когда Вы хотите остановить поток, необходимо закрыть сокет, а также называющий прерывание),

4) Существует мало точки в выдаче Ваших собственных исключений из Потока, если Вы не ожидаете ловить его где-то в другом месте. Лучшее решение состоит в том, чтобы зарегистрировать ошибку и если это неисправимо, остановите поток. Поток может остановить себя с кодом как (в том же контексте как выше):

public void run(){
    while(Thread.currentThread() == runner){
      //do stuff which can be interrupted if necessary

      if(/*fatal error*/){
        stopThread();
        return; //optional in this case since the loop will exit anyways
      }
    }
  }

Наконец, если Вы хотите быть уверенными, что поток выходит с остальной частью Вашего приложения, независимо от того, что, хорошая техника состоит в том, чтобы назвать Thread.setDaemon (верным) после создания и перед запуском потока. Это отмечает поток как поток демона, означая, что VM гарантирует, что автоматически уничтожается, если нет никакого выполнения потоков недемона (такой, как будто Ваше приложение выходит).

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

90
ответ дан sooniln 27 November 2019 в 03:16
поделиться

На самом деле, вам не нужна переменная "runner", как описано выше, например:

while (!interrupted()) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException ex) {
        break;
    }
}

Но, как правило, использование цикла Thread.sleep () - это действительно плохая идея.

Посмотрите на AsyncTask API в новом 1.5 API. Вероятно, это решит вашу проблему более элегантно, чем использование службы. Ваш телефон становится медленным, потому что служба никогда не закрывается - нет ничего, что могло бы заставить службу убить себя.

6
ответ дан 27 November 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: