【问题标题】:how to restart a thread in android?如何在android中重新启动线程?
【发布时间】:2010-06-22 16:41:01
【问题描述】:

在我的 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() 会使应用程序崩溃。

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

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

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

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

    如果您的真正线程不是您在此处显示的内容,而是某种无限循环,那么这通常是个坏主意。永远不要创建繁忙的循环,尤其是在 Android 中。最有可能的是,您的问题有更好的解决方案,或许也可以避免使用interrupt()。

    【讨论】:

    • 我剪掉了线程主体的几乎所有内容,因为它似乎与演示目的无关。 “原始”线程具有无限循环,在每一轮中从服务中查询一些数据。然后处理程序负责实际显示线程获取的数据。由于返回此活动时该线程不再运行,因此我的用户界面不再更新。 :(这就是为什么我需要以某种方式再次启动线程...
    • 计时器是此类任务的更好选择,尤其是在嵌入式平台上。服务器上的忙循环是一回事,但在电池电量不足的手机上,操作系统可以更好地处理定期调度任务。
    【解决方案2】:

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

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

    更新:

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

    【讨论】:

    • 我的应用提供了一项服务,该线程会定期查询该服务以获取数据更新。
    【解决方案3】:

    在普通的 Java 中(我认为这也适用于 Android),线程对象一旦停止就无法再次复活。

    【讨论】:

      【解决方案4】:

      看这里:

      在HowToStopAThread 中停止线程的建议方法

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        相关资源
        最近更新 更多