【问题标题】:Android Stop Runnable created in new ThreadAndroid Stop Runnable 在新线程中创建
【发布时间】:2016-04-25 14:41:16
【问题描述】:

在我的Androidapp 中,我启动了一个Runnable(称为remoteUDPRunnable),它与另一个设备在新的Thread 中建立UDP Connection,如下所示:

new Thread(remoteUDPRunnable).start();

在某些情况下,我想停止 Thread(并取消 UDP connection)但我不知道如何

我尝试将Thread 实例保留在variable 中并调用myThread.interrupt(),但它不起作用。

我也尝试过像这样使用Handler

final Handler remoteUDPRunnableHandler = new Handler();
remoteUDPRunnableHandler.post(remoteUDPRunnable);

所以我可以这样做取消它:

remoteUDPRunnableHandler.removeCallbacks(remoteUDPRunnable);

这可行,但是当我调用 post(remoteUDPRunnable) 方法时,我得到一个 NetworkOnMainThreadException。我也尝试将代码放在Runnable 中的AsyncTask 中,但它也不起作用。

有什么想法吗?我对此很陌生,对此我有些困惑。 谢谢

【问题讨论】:

  • 中断只是在线程中设置一个标志。您需要在 Runnable 中检查该标志 (Thread.interrupted()) 并确保您的线程自行结束。
  • Re,“我已经尝试 [...] 致电 myThread.interrupt(),但它不起作用。”:怎么不起作用?这听起来像是一个很好的 StackOverflow 问题。您应该编写一个其他人可以运行的小型、独立的示例程序,显示t.interrupt() 没有按照您的预期执行;然后你应该把它贴在这里,问我们为什么它没有做你期望它做的事情。
  • P.S.:在这个问题中没有理由使用“Runnable”这个词。 Runnable 只是意味着它是一个对象,它有一个名为 void run() 的方法。它没有告诉我们您如何使用该对象的任何信息。

标签: java android multithreading udp runnable


【解决方案1】:

如果您自己编写了remoteUDPRunnable 类,您需要确保(以编程方式)线程结束。

调用thread.interrupt() 仅在该线程中设置一个标志。但如果你从不检查它并用它做点什么,那就完全没用了。

在你的runnable中你需要调用Thread.interrupted(),如果它返回true,启动线程的关闭。注意,调用Thread.interrupted()会重置执行线程的中断标志。

另外,如果InterruptedException 被抛出,中断标志也会被重置,所以你可能需要在你的runnable 中再次调用Thread.interrupt()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2011-08-22
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多