在销毁活动时,活动中的Android停止线程

时间:2012-08-04 21:01:13

标签: android multithreading tcp

我有一个Activity,它在onStart()方法中创建一个Thread。 Thread用于通过TCP读取网络数据,并在while循环中有一个阻塞网络读取方法,用于检查每个增量的布尔变量。

我的问题是当使用后退键销毁Activity时,我将布尔循环控制变量的值设置为false,但线程不会完成,因为它停留在阻塞网络方法上。

public class MyActivity extends Activity implements Runnable
{
    Thread thread;
    boolean loopControl;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }
    protected void onStart()
    {
        super.onStart();
        loopControl=true;
        thread = new Thread(this);
        thread.start();
    }

    public void run()
    {
        while(loopControl)
        {
            directories = (Vector<String>) TCPFunctions.inputStream.readObject();
        }
    }

    protected void onDestroy()
    {
        super.onDestroy();
        loopcontrol = false;
    }
}

如何完成我想要的线程,因为在再次启动此Activity时会产生问题。

实际上每次活动开始时都会有一些数据要从服务器

中读取

3 个答案:

答案 0 :(得分:0)

在你的onDestroy()方法中

试试

thread.interrupt();  
thread=null;

答案 1 :(得分:0)

我仍然是Android的新手,但我会试一试:

您确定调用了onDestroy()方法吗?也许您只是使用Home或Back按钮退出应用程序,在这种情况下,onDestroy()方法根本不会被调用,如本页图中所示: Activity Lifecycle - Pausing

当应用程序变为“隐藏”并将其放入onStop()时,您可能希望线程停止工作:

loopcontrol = false;
thread.interrupt();  
thread=null;

如果是这种情况,在返回/重新启动应用程序时也不一定会调用onCreate(),所以启动的线程可能应该在onResume()中吗?

答案 2 :(得分:0)

你想要达到什么目标?

在这种情况下,从其中一个Activity回调方法启动后台线程可能不是一个好主意。活动可能会被破坏并从头开始重新创建(例如,这是旋转手机时的默认行为),在这种情况下,您将丢失线程......

更好的方法是创建Service ......但是,关于来自活动/服务/其他事项的tcp通信,这里有很多问题/答案。