代码之家  ›  专栏  ›  技术社区  ›  xenonite

如何在Android中重新启动线程?

  •  3
  • xenonite  · 技术社区  · 16 年前

    在我的Android应用程序中,我有一个用户界面更新线程,使我的所有视图保持最新。

    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())中调用initial start()会使应用程序崩溃。

    我已经尝试了很多东西,但似乎没有什么效果:(

    4 回复  |  直到 13 年前
        1
  •  6
  •   CommonsWare    16 年前

    AtmoCreation的答案是正确的……假设您的实现首先是一个好主意。

    首先,您在这里显示的线程运行短暂,并立即自行终止,因此您不需要调用 interrupt() 停止它。在这种情况下,你最好换成 AsyncTask 而不是您自己的线程和处理程序,因为您将需要更少的代码并可以利用 异步任务 线程池。

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

        2
  •  3
  •   Robby Pond    16 年前

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

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

    更新:

    然后让它向后工作。你的服务应该告诉你的应用程序什么时候更新。如果你这样做,那么你不需要一个线程在你的应用程序中运行,你的问题将得到解决。您可以使用ResultsReceiver模式,将活动绑定到服务,并让服务将结果发送回活动。每当OnCreate在您的活动上运行时,您就可以重新绑定到服务。退房 Google I/O 2010 app 举个例子。

        3
  •  2
  •   Atmocreations    16 年前

    在普通Java中(我认为这也适用于Android),一旦停止了线程对象,就不能再次使用它。

        4
  •  0
  •   Sathish    13 年前

    看这里:

    阻止线程进入的建议方法 HowToStopAThread