Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止android中的线程活动_Android_Multithreading - Fatal编程技术网

停止android中的线程活动

停止android中的线程活动,android,multithreading,Android,Multithreading,我不知道如何声明销毁此活动。如果我退出应用程序,它会使整个手机崩溃,因为它是在后台运行的。我在另一个问题中给出了一个提纲,但我不确定如何实施。我目前有: new Thread(new Runnable(){ @Override public void run() { while(true) handler.sendEmptyMessage(FIRE); } }).start(); 那我该怎么阻止这一切呢。我一根线也停不下来,我在看书,那很

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

new Thread(new Runnable(){
    @Override
    public void run() {
        while(true)
        handler.sendEmptyMessage(FIRE);
    }
}).start();
那我该怎么阻止这一切呢。我一根线也停不下来,我在看书,那很危险。那么,我应该如何构造它,使它不会破坏系统?我是否应该删除
while
循环,使其成为一个方法,并在暂停时终止该方法?比如:

public void run() {
    handlerMsg();
}}).start():
然后我可以做:

onFinish() {
    handlerMsg.stop
}

这感觉不对。任何帮助都会得到极大的感谢。

为什么不添加一个简单的条件来更新线程所查看的全局变量,并在您希望它停止时更新它,然后让线程到达其末端

像这样:

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的活动,你可以考虑把它变成一个服务而不是完全成熟的活动。这使得它可以在后台运行,并在没有任何用户交互的情况下完成它需要做的事情

我希望这有帮助

它的流量将是

活动启动服务->服务生成线程->执行其工作->通过广播返回ok,然后停止服务


如果这有帮助的话,别忘了在上面标注一个答案:)

为什么不添加一个简单的条件来更新线程所查看的全局变量,并在您希望它停止时更新它,然后让线程到达其末端

像这样:

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的活动,你可以考虑把它变成一个服务而不是完全成熟的活动。这使得它可以在后台运行,并在没有任何用户交互的情况下完成它需要做的事情

我希望这有帮助

它的流量将是

活动启动服务->服务生成线程->执行其工作->通过广播返回ok,然后停止服务


如果这有帮助的话,别忘了在上面标注一个答案:)

如果您在没有框架的情况下使用Thread类进行长时间运行(始终运行)(请参见:ThreadExecutor),最终处理消息,则会误解其预期用途。这应该在服务中完成。 如果你想时不时地触发一些东西,你可能还可以使用一个处理程序(它可以在一段时间后设置为fire,然后在以后重置为fire)

回到您的基本问题:只要线程本身能够停止自身,您就可以随时停止正在运行的线程对象。查看Thread类的interrupt()和interrupted()函数。如果你在你的线程中发布一个Thread.interrupt(),线程必须检查(异常),如果有什么事情需要他停止并按请求执行。
不管怎样,你在服务方面会做得更好。一旦您的活动绑定到它,它就会启动,一旦它不再绑定,它就会自动停止。

如果您在没有框架的情况下使用Thread类进行长时间运行(始终运行)(请参见:ThreadExecutor),最终会处理消息,那么您误解了它的预期用途。这应该在服务中完成。 如果你想时不时地触发一些东西,你可能还可以使用一个处理程序(它可以在一段时间后设置为fire,然后在以后重置为fire)

回到您的基本问题:只要线程本身能够停止自身,您就可以随时停止正在运行的线程对象。查看Thread类的interrupt()和interrupted()函数。如果你在你的线程中发布一个Thread.interrupt(),线程必须检查(异常),如果有什么事情需要他停止并按请求执行。
不管怎样,你在服务方面会做得更好。当您的活动绑定到它时,它将立即启动,当它不再绑定时,它将自动停止。

一般来说,有几种机制可以执行您尝试执行的操作,其复杂性和有效性各不相同。我想大致描述几个

服务

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

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

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

    在我看来,这有点复杂。简单的服务从设计上来说是简单的。复杂的服务非常复杂,需要大量的设计工作。除此之外,服务往往被信息不灵通的用户用任务杀手“屏蔽”

    HandlerThread

    第二种选择是一种新的选择。我发现这在应用程序构建和维护方面都不那么复杂。处理程序使用消息和q的系统