我有一个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时会产生问题。
实际上每次活动开始时都会有一些数据要从服务器
中读取答案 0 :(得分:0)
试试
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通信,这里有很多问题/答案。