在android中停止线程活动

时间:2011-01-27 23:30:45

标签: android multithreading

我不知道如何宣布销毁此活动。如果我退出应用程序,它会崩溃整个手机,因为它在后台运行。我有一个大纲,我在另一个问题中给出了,但我不确定如何实现它。我目前有:

new Thread(new Runnable(){
    @Override
    public void run() {
        while(true)
        handler.sendEmptyMessage(FIRE);
    }
}).start();

那么我该怎么做呢?我无法阻止一个线程,我正在读这是危险的。那么我应该如何构建它以便它不会崩溃系统?我应该删除while循环,使其成为方法,并在暂停时终止该方法吗?喜欢:

public void run() {
    handlerMsg();
}}).start():

然后我可以做:

onFinish() {
    handlerMsg.stop
}

那感觉不对。任何帮助都会得到很多的感激。

3 个答案:

答案 0 :(得分:2)

如果你在没有框架的情况下使用Thread类进行非常长时间运行(总是在运行)的东西(参见:ThreadExecutor),最终处理消息,你就误解了它的用法。这应该在服务中完成。 如果你想偶尔触发一些东西,你可能也可以使用一个处理程序(可以在一段时间后设置为激活,然后在以后重置为再次触发)。

回到基本问题:只要线程本身能够自行停止,您就可以自由地停止正在运行的线程对象。查看Thread类的interrupt()和interrupted()函数。你将Thread.interrupt()发布到你的线程,线程必须检查(例外),如果有什么东西要他停下来并按要求做。 无论如何,你会更好地使用服务。它会在您的活动与其绑定后立即启动,并且一旦它没有绑定就会自动停止。

答案 1 :(得分:2)

一般来说,有几种机制可以做你正在尝试做的事情,具有不同程度的复杂性和有效性。我想概括地描述一些。

<强>服务

Services可以被认为是无头活动。这个想法是服务发布一个接口,其他代码可以通过该接口与之交互。服务由Android管理,在需要时启动,不在时关闭。

服务提供了一些独特的品质:(来自链接文档)

  1. 应用程序的工具,用于告诉系统它想要在后台执行的操作(即使用户没有直接与应用程序交互)。这对应于对Context.startService()的调用,该调用要求系统安排服务工作,直到服务或其他人明确停止它为止。
  2. 应用程序的一个工具,用于将其某些功能公开给其他应用程序。这对应于对Context.bindService()的调用,它允许对服务进行长期连接以便与服务进行交互。
  3. 因此,当您希望以某种方式完成某些处理时,您可能希望使用某项服务,该方式允许在活动停止后继续处理,或者您希望在多个应用之间共享处理代码的单个实例

    在我看来,这带来了一些复杂性。简单的服务,设计简单。复杂的服务非常复杂,需要大量的设计工作。除此之外,使用TaskKillers的服务不足的用户往往会“服务”服务。

    <强> HandlerThread

    第二个选项是HandlerThread。我发现在应用程序构建和维护方面这一点都不那么复杂。处理程序使用消息和队列系统进行通信。在我看来,这在代码复杂性和将私有工作服务与应用程序的其他组件分离的能力之间创造了一个很好的平衡。您需要通过从拥有类调用HandlerThread上的start()然后向它发送一个您定义为关闭消息并使其自行停止的消息来管理此HandlerThread的生命周期。您可以找到配置here

    的示例

    <强>可运行

    如何进行裸骨多线程的经典示例。你已经知道如何做到这一点。停止单个线程的最佳示例是设置您自己的环境变量以供线程监视。

    private static boolean stop = false;
    new Thread(new Runnable {
      public void run(){
        if(!stop){
          //do work
        }
      }
    });
    Thread.sleep(1000);
    stop = true;
    

    您可以在here

    这个主题上找到一个很好的讨论

    根据您所处的阶段,您当然可以考虑根据您的要求切换到其他更强大的线程选项之一。

答案 2 :(得分:0)

为什么不添加一个简单的条件来更新线程所看到的全局变量以及何时希望它停止,然后让线程到达终点。

像这样:

thread t = new thread(new runnable(){

public void run()
{
  while(continue())
  {
    handler.send(....)
  }
}

private bool continue()
{
   doing something
   return false when done
   else true
}

这样做,将允许你控制线程何时停止(到达终点)而不是强行停止它。

另外要考虑的另一件事是,如果它是一个没有UI的活动,您可能会考虑将其变成服务而不是完全成熟的活动。这允许它在后台运行并在没有任何用户交互的情况下完成它需要做的事情!

我希望这会有所帮助。

它的流程将是

活动启动服务 - &gt;服务产生线程 - &gt;做它的工作 - &gt;通过广播返回ok,然后停止服务。

如果这有帮助,请不要忘记用答案标记:)!