2012-08-04 98 views
2

我有一个Activity在onStart()方法中创建线程。 线程用于通过TCP读取网络数据,并在while循环内具有阻塞网络读取方法,该方法检查每个增量上的布尔变量。活动时Android停止线程在销毁时的活动

我的问题是,当使用后退键销毁活动时,我将布尔循环控制变量的值设置为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; 
    } 
} 

我怎么完成这样的线程,因为我希望它,因为它在这个活动再次启动造成了一个问题。

其实每次活动开始它的时候有一些数据从您的onDestroy()方法的服务器

回答

0

阅读尝试

thread.interrupt(); 
thread=null; 
+0

没有帮助,旧的线程仍然运行,并且在活动在销毁后再次启动时再次创建新线程。当活动再次启动时,它会从服务器获取一些实际上由旧线程读取的初始化数据,并将新线程留空(检查我的文章的最后一行,只是更新) – Anjanu 2012-08-04 21:18:24

+0

@Anjanu尝试在一个实现Runnable除了MainActivity之外的其他类。 – kalz 2012-08-04 21:36:49

+0

确定将尝试并在以后报告 – Anjanu 2012-08-04 21:49:47

0

我仍然是一种新的Android处,但我会给它一个镜头:

你确定你的onDestroy()方法被调用?也许你只是退出使用Home或后退按钮您的应用程序,并在这些情况下的onDestroy()方法不一定会因为显示此页上的图中的全称为: Activity Lifecycle - Pausing

也许你想线程停止其工作时,应用程序成为“隐藏”,并把这个的onStop()代替:

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

如果是这样的话,还的onCreate()不一定会叫,当您返回/重新启动应用程序,所以也许线程启动应该在onResume()?

0

你想达到什么目的?

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

更好的方法是创建Service ...但那里在这里有很多关于活动/服务/其他事情的TCP通信的问题/答案。

+0

确定将尝试服务...实际上在处理UDP套接字时,我处于类似的情况......我在那里设置了一个2秒的套接字超时......所以阻塞语句每隔2秒就抛出一个异常,并且它将Catch块称为整个函数再次递归地得到一个机会来检查循环控制变量的值......但是这样使用异常处理是公平的......只是问 – Anjanu 2012-08-05 09:26:48