我需要删除Android中的线程吗?

4

我有一个来自线程的函数调用:

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

Android在while循环终止时会删除线程吗?还是我需要以某种方式删除它?请注意,不要删除HTML标记。
2个回答

5
这里有两个概念。一个是线程本身,它在处理器中运行,并拥有堆栈内存。另一个是Thread对象,它基本上是一个控制面板,用于访问线程。
线程具有堆栈内存,当线程死亡(即run()完成或抛出异常)时,该内存将被释放。然而,Thread Java对象会一直存在,直到没有对它的引用为止。
假设你有以下代码:
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的内存将保留直到实例变量设置为nil或封闭类的对象被回收为止。


3

当您从线程中返回时,实质上已经停止了它,因此不需要执行任何特定操作来删除线程。请记住,这不是在Android中使用线程的好方法。如果您正在从非UI线程更新UI,则很可能会收到框架的投诉。相反,您应该阅读一些关于AsyncTask的教程,并转向该模型,因为它确实可以让您更新UI。


它不对 UI 进行任何更改,它更改了某些坐标的值,这些坐标由另一个线程处理,该线程通过使用 lockcanvas 来更新屏幕。这样做可以吗? - Araw
当然,但您不必做任何事情来终止线程。 - Kristopher Micinski
@JeffreyBlattman你知道这是否会对性能有任何影响吗? - Araw
runOnUiThread很简单,AsyncTask更强大。你只需要看看两者,看哪个最适合你要做的事情。 - Jeffrey Blattman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接