3

我有一个 Activity 在 onStart() 方法中创建一个线程。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 时它会产生问题。

实际上,每次活动启动时,它都会从服务器读取一些数据

4

3 回答 3

0

在你的 onDestroy() 方法中尝试

thread.interrupt();  
thread=null;
于 2012-08-04T21:08:31.090 回答
0

我在 Android 上还是个新手,但我会试一试:

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

也许您希望线程在应用程序“隐藏”时停止工作,并将其放在 onStop() 中:

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

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

于 2012-08-04T22:05:08.203 回答
0

你想达到什么目的?

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

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

于 2012-08-04T22:36:01.797 回答