【问题标题】:Android Stop thread within Activity when Activity in DestroyedActivity 销毁时,Android 停止 Activity 中的线程
【发布时间】:2012-08-02 11:05:11
【问题描述】:

我有一个在 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 时产生问题。

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

【问题讨论】:

    标签: android multithreading tcp


    【解决方案1】:

    在你的 onDestroy() 方法中尝试

    thread.interrupt();  
    thread=null;
    

    【讨论】:

    • 没有帮助,旧线程仍在运行,并且在销毁后再次启动 Activity 时再次创建新线程。当活动再次启动时,它会从服务器获取一些初始化数据,这些数据实际上是由旧线程读取的,新线程是空的(检查我帖子的最后一行,刚刚更新)
    • @Anjanu 尝试在 MainActivity 以外的类中实现 Runnable。
    • @Anjanu 您还应该检查主线程循环中的中断标志...类似于while (!thread.interrupted) { do backgroundwork}
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      你想达到什么目的?

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

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

      【讨论】:

      • 好的将尝试服务...实际上我在使用 UDP 套接字时很早以前就处于类似的情况...在那里我设置了 2 秒的套接字超时...所以阻塞语句抛出每 2 秒后出现一个异常,它是 Catch 块我再次递归调用整个函数是否有机会检查循环控制变量的值...但是以这种方式使用异常处理是否公平...只是问
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多