gpt4 book ai didi

android - 每次创建新线程时都会添加到主线程组

转载 作者:行者123 更新时间:2023-11-29 02:12:42 28 4
gpt4 key购买 nike

我正在创建许多表面 View 实例来查看一些对象,但一次创建一个实例,然后调用 surfaceDestroyed。但是我每次在 surfacecreated 上创建的线程都被添加到主线程组中。

虽然我正在中断并使它无效,但它仍然驻留在主线程组中并创建低内存异常。

代码 fragment :构造函数

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;
}
}
}

更新Thread.list 函数显示我的中断和空线程仍在线程组中

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]

如何删除它们?

最佳答案

一些需要寻找的东西。

  1. 您只是在 catch block 内调用 _thread = null - 这意味着如果从未抛出异常,它不会被设置为 null。将它移到 finally block 中。
  2. 可能永远不会抛出该异常。调用 Thread.interrupt() 不会抛出它。这会将线程的中断标志设置为 true。整个 while 循环相当奇怪,您可能应该重写它。
  3. 您正在将其实例传递给 BreedingThread。确保该对象不会永远引用您的表面 View
  4. 简单地调用 surface view destroy 方法并不意味着如果某些东西仍然持有对它的引用(例如我在 3 中提到的),则引用将被删除。

关于android - 每次创建新线程时都会添加到主线程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6304879/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com