首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当Activity被销毁时,在Activity中停止线程

当Activity被销毁时,在Activity中停止线程
EN

Stack Overflow用户
提问于 2012-08-05 05:01:13
回答 3查看 3.1K关注 0票数 3

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

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

代码语言:javascript
运行
复制
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;
    }
}

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-08-05 05:08:31

在onDestroy()方法中,尝试

代码语言:javascript
运行
复制
thread.interrupt();  
thread=null;
票数 0
EN

Stack Overflow用户

发布于 2012-08-05 06:05:08

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

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

也许你想让线程在应用程序变得“隐藏”时停止工作,并将其放入onStop()中:

代码语言:javascript
运行
复制
loopcontrol = false;
thread.interrupt();  
thread=null;

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

票数 0
EN

Stack Overflow用户

发布于 2012-08-05 06:36:02

你想要达到什么目的?

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

更好的方法可能是创建Service...但是这里有很多关于tcp通信的问题/答案,来自activity/Services/other things。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11811981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档