2012-03-23 3 views
3

У меня есть следующий вызов функции из потока:Должен ли я удалить темы в Android

 Thread Move = new Thread(){ 
      public void run() 
      { 
       while(ButtonDown){ 
        UpdateValues(); 
        try { 
         Thread.sleep(50); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }; 
     Move.start(); 

Будет ли Android удалить нитку, когда перерывы в то время как контур, или я должен удалить его в некотором роде ?

ответ

2

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

+0

Он не вносит никаких изменений в пользовательский интерфейс, он изменяет значения некоторых координат, которые обрабатываются другим потоком, который заботится об обновлении экрана с помощью lockcanvas. Это хороший способ сделать это? – Araw

+0

Уверен, но вам не нужно ничего делать, чтобы убить нить. –

+0

Хорошо, спасибо за вашу помощь :) +1 – Araw

2

Здесь есть два понятия. Один из них - это сам поток, работающий в процессоре, имеющий стекную память. Другой - объект Thread, который представляет собой панель управления для доступа к потоку.

В потоке есть память стека, которая отбрасывается, когда нить умирает (run() завершается, или исключение бросается, в основном). Тем не менее, java-объект Thread остается вокруг, пока на нем больше нет ссылки.

Итак, допустим, у вас это:

this.myThread = new Thread(){ 
      public void run() 
      { 
       int[] takeUpSomeMemory = new int[10000]; 

       while(ButtonDown){ 
        UpdateValues(); 
        try { 
         Thread.sleep(50); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }; 
this.myThread.start(); 

Так у вас есть экземпляр переменной myThread который содержит ссылку на Thread вы создаете. Когда вызывается метод start, вызывается ваш поток и выделяет довольно небольшую часть памяти для переменной takeUpSomeMemory. После того, как метод run() умирает, выполнив выполнение или выбросив исключение, память для takeUpSomeMemory - это сборщик мусора. Память для this.myThread сохраняется до тех пор, пока значение параметра instanceVariable не будет установлено равным nil или объект окружающего класса будет собран в мусор.

+0

Вижу, спасибо за хорошее описание! – Araw

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