3

いくつかのオブジェクトを表示するために多数のサーフェス ビュー インスタンスを作成していますが、一度に 1 つのインスタンスが作成されてから surfaceDestroyed が呼び出されます。しかし、surfacecreated で毎回作成しているスレッドは、メインの 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 関数は、中断されたスレッドと null スレッドがまだスレッドグループにあることを示しています

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]

それらを削除するには?

4

2 に答える 2

1

探すべきいくつかのこと。

  1. catch ブロック内で _thread = null を呼び出すだけです。これは、例外がスローされない場合、null に設定されないことを意味します。それを finally ブロック内に移動します。
  2. その例外はおそらく決してスローされません。Thread.interrupt() を呼び出してもスローされません。これにより、スレッドの割り込みフラグが true に設定されます。そのwhileループ全体はかなり奇妙で、おそらく書き直す必要があります。
  3. これのインスタンスを BreedingThread に渡しています。オブジェクトがサーフェス ビューへの参照を永久に保持していないことを確認してください
  4. 単純にサーフェス ビューの destroy メソッドを呼び出しても、何かがまだ参照を保持している場合に参照が削除されるわけではありません (たとえば、3 で述べたように)。
于 2011-06-10T10:31:09.497 に答える