如何重启android中的线程?

时间:2010-06-22 16:41:02

标签: java android multithreading

在我的Android应用程序中,我有一个ui-update-thread,可以使我的所有视图保持最新状态。

protected Thread UIUpdateThread = new Thread()
{
 @Override
 public void run()
 {
  while(true)
  {
    query_some_data_from_service(); // gets some "fresh" data from a service
    UIUpdateHandler.sendEmptyMessage(0); // will update all ui elements with the new values
    sleep(1234);
  }
 }
};

我使用

在onCreate()中启动此线程
UIUpdateThread.start();

并且一切正常:)当我离开活动时(例如,因为我切换到另一个活动)我打电话

UIUpdateThread.interrupt();
在onStop()中

以防止线程一直运行。如果我不这样做,它会继续运行,即使我关闭应用程序!?!?!!

问题是:当从其他活动返回到此活动时,我如何将此线程恢复生机? run()不起作用,在onResume()之类的其他方法中调用初始start()会使应用程序崩溃。

我已经尝试了很多东西,但似乎没有任何作用:(

4 个答案:

答案 0 :(得分:6)

Atmocreation的答案是正确的......假设你的实现首先是一个好主意。

首先,您在此处显示的主题会短暂运行并立即终止,因此您无需调用interrupt()来停止它。在这种情况下,您可能更好地切换到AsyncTask而不是您自己的线程和处理程序,因为您将需要更少的代码并可以利用AsyncTask的线程池。

如果你的真实线程不是你在这里展示的,而是某种无限循环,那一般来说这是一个坏主意。永远不要创建繁忙的循环,尤其是在Android中最有可能的是,对于您的问题有一个更好的解决方案,也许可以避免需要interrupt()

答案 1 :(得分:3)

每个线程只能调用一次Thread.start()。多次调用start()将抛出异常,我相信你已经注意到了。

这似乎是一个奇怪的用例。为什么要运行一个线程来更新UI? Android应用程序的主要线程是UI线程,所有UI更新都必须在该线程上完成。

<强>更新

然后你让它倒退了。您的服务应该告诉您的应用何时更新。如果你这样做,那么你不需要在你的应用程序中运行一个线程,你的问题就会得到解决。您可以使用ResultsReceiver模式,让您将Activity绑定到您的服务,并让服务将结果发送回您的活动。每当onCreate在您的活动上运行时,您就可以重新绑定到该服务。查看Google I/O 2010 app以获取示例。

答案 2 :(得分:2)

在普通的Java中(我认为这也适用于Android),一旦Thread-Object被停止,它就不能再被赋予生命。

答案 3 :(得分:0)

看这里:

HowToStopAThread

中停止线程的建议方法