2011-06-10 10 views
2

Я создаю много экземпляров поверхности для просмотра некоторых объектов, но один экземпляр создается за один раз, а затем вызывается метод surfaceDestroyed. но поток, который я создаю каждый раз при создании поверхности, добавляется в главную ThreadGroup.каждый раз при создании новой темы добавляется в главную ThreadGroup

Хотя я прерываю и сворачиваю его, но он все еще находится в главной теме и создает исключение с низкой памятью.

фрагменты кода: конструктор

public class MsurfaceView extends SurfaceView implements 
     SurfaceHolder.Callback { 
_thread = new mThread(this); 
    _thread.setName("mThread"); 


@Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     if (!_thread.isAlive()) { 
      _thread = new BreedingThread(this); 
     } 

     _thread.setRunning(true); 
     _thread.start(); 

    } 





@Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.d("mThread", "Surface Destroyed Called"); 
     getHolder().removeCallback(this); 
     getHolder().addCallback(null); 

     boolean retry = true; 
     _thread.setRunning(false); 

     while (retry) { 
      try { 
       _thread.interrupt(); 
       _thread.getThreadGroup().interrupt(); 
       _thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       Log.d("mThread", "Interrupted"); 
       // pass interrupt exception 
       Thread.currentThread().interrupt(); 
       Log.d("mThread", "b4 threadGroupInterrupted"); 
       _thread.getThreadGroup().interrupt(); 
       _thread.getThreadGroup().list();//this shows thread is in //list 
       _thread = null; 
       break; 
      } 
     } 
    } 

UPDATE функция Thread.list показывает, что мой прерываться и нулевой поток все еще в ThreadGroup

06-10 15:22:52.780: INFO/System.out(1814): java.lang.ThreadGroup[name=main,maxPriority=10] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[main,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Binder Thread #1,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Binder Thread #2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[FlurryAgent,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[AsyncTask #1,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[AsyncTask #2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-17,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-38,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Timer-2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-53,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-286,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-327,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-359,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-409,5,main] 

как удалить их?

+0

не полный код; просто фрагменты кода для понимания. Я создаю этот обзор поверхности и этот поток после уничтожения. –

+0

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

+0

hProf анализ показывает, что только основная ThreadGroup ссылается на мой BreedingThread –

ответ

1

Некоторые вещи, которые нужно искать.

  1. Вы вызываете _thread = null внутри блока catch - это означает, что он не будет установлен в значение null, если исключение никогда не будет выбрано. Переместите это внутри блока finally.
  2. Это исключение, вероятно, никогда не выбрасывается. Вызов Thread.interrupt() не будет его бросать. Это устанавливает флаг прерывания потока в true. Весь цикл while довольно странный, и вы, вероятно, должны его переписать.
  3. Вы передаете экземпляр этого файла BreedingThread. Удостоверьтесь, что объект не держит ссылку на ваш вид поверхности навсегда
  4. Просто вызов метода уничтожения поверхности не означает, что ссылка будет удалена, если что-то все еще держит ссылку на нее (например, я упоминаю в 3, например).
+0

Журнал печатает, что поток прерывается. Я использовал hprof с анализатором памяти и только показал, что размножениеThread создает беспорядок переполнения памяти, и все экземпляры поверхностного вида были очищены из памяти. Я танкую _thread = null; наконец. thnx пожалуйста, помогите –

0

Когда вы вызываете «новая тема» и не указываете группу, поток будет добавлен в ту же группу, что и вызывающий (то есть Thread.currentThread().getThreadGroup()). В вашем случае это то, что заставляет ваши потоки добавляться в «основную» группу потоков. Чтобы изменить это поведение, используйте команду new Thread(group, this), чтобы указать группу.

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