onDestroy,杀死正在运行的线程

时间:2012-11-08 12:28:52

标签: android

我的课程中有一个这样的方法,它扩展了Activity

@Override
public void onDestroy() {
    Log.i("onDestory: ", "Inside OnDestory!");
    bluetoothCommunicator.destroyedApp();
    super.onDestroy(); 
}

方法destroyedApp()如下所示:

public void destroyedApp() {
        if(server != null)
            server.destroy();   
}

其中server是扩展Thread

的类的实例

以下是该方案:

我是第一次打开应用程序,在我的onCreate方法中,我创建了一个设置BluetoothServerSocket的蓝牙类的新实例,这很好用,我能够将文件传输到我的手机。

当我在后台运行我的应用程序时,这也有效,因为该线程仍处于活动状态。

但是

根据Activity Life Cycle

,当我要杀死该应用程序时

Activity Life Cycle here

Android框架应调用onDestroy()方法。当我再次启动应用程序时,应调用onCreate方法,但似乎并未创建BluetoothServerSocket的实例。我没有LogCat信息,因为发送蓝牙文件的设备只说:

Error Log:
Write Error: 
Transport endpoint is not connected
__obex_connect:
error=-2
Unable to connect to the server
Error

这告诉我BluetoothServerSocket不是“活着的”

关于如何实现这一目标的任何建议?

3 个答案:

答案 0 :(得分:3)

通常无法保证根本不会调用onDestroy()方法。根据文件:

注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的主机进程,因此在进程消失后,系统不应该用它来做剩余的事情。

    派生类必须调用超类的此方法的实现。如果他们不这样做,将抛出异常。


所以我首先测试它是否被可靠地调用。

此外,您正在super.onStop()中调用onDestroy()。它应该是super.onDestroy()

答案 1 :(得分:2)

由于我无法评论,我在这里发帖。 正如Egor所评论我不认为你可以从onDestroy()中调用onStop(),Android本身会在onPause()之后调用onStop(),具体取决于内存。 现在,请注意不推荐使用线程的stop(),suspend()和destroy()方法,终止线程的唯一安全方法是让线程退出其run()。 现在,当您调用server.destroy()时,它可能仍然在内存中保留一些链接,因此垃圾收集器将无法垃圾收集您的活动。因此,我相信这可能是你没有调用onDestroy的可能原因。 如果我知道的话请指出我。

答案 2 :(得分:1)

你是如何杀死你的申请的?我正在为Application课程中的问题寻找解决方案,我发现了有关onTerminate()方法的信息:

  

此方法适用于模拟过程环境。永远不会在生产Android设备上调用它,只需杀死它们即可删除进程; 无用户代码(包括此回调)在执行此操作时执行

我记得我的一个应用程序中存在类似的问题,其中一些组件'onDestroy()方法未被调用,因为我在任务管理器(Samsung Galaxy 2)中使用了“清除内存”按钮