【问题标题】:Android show dialog from background thread in any activity of applicationAndroid 在应用程序的任何活动中从后台线程显示对话框
【发布时间】:2011-03-03 21:32:16
【问题描述】:

我试图寻找明确的答案,但无法在任何地方找到它。我在检查某些变量的主要活动中运行后台线程,如果它是真的,它应该显示警报对话框。我还希望此对话框显示在应用程序的任何重点活动上。我通过将 Looper.prepare() 和 Looper.loop() 添加到线程来尝试它,但它不能正常工作并且它影响了我用来检查该线程中变量的 while() 循环。谁能帮我找出实现这一点的最佳方法是什么?

谢谢。

【问题讨论】:

    标签: android multithreading dialog background


    【解决方案1】:

    如果使用main/ui线程构造后台线程,可以在构造函数中创建Handler。当你想在 main/ui 线程上运行一些代码时,你只需 Handler.post(Runnable r) 和一个可运行的 ui 线程。

    如果您的后台线程不是在 ui/main 线程上构建的,您可以使用 BroadcastIntent 和 BroadcastReceiver 模式在后台线程和前台活动之间发送消息。如果您在后台线程的使用寿命期间切换前台活动,这将特别有用。

    【讨论】:

    • 第一种方法,是的。对于第二种方法,您只需在每个活动中实现广播侦听器。或者,您可以创建一个扩展 Activity 的抽象类,并具有处理广播侦听器的代码,并使用 runOnUiThread 将可运行对象放入 ui 线程。我的猜测是,您会发现这种机制比重新实现广播侦听器更容易管理。
    • 拥有广播监听器是性能方面的最佳实践吗?
    • 从将服务与活动分离的角度来看,这是一个非常好的做法。性能方面,我不知道为什么它会有一个显着的性能问题。该机制类似于邮箱投递设置,通常编写得非常高效。您还可以根据需要打开和关闭监听器。
    【解决方案2】:

    您可能想尝试创建Runnable 的实现并将其传递给Viewpost() 方法。

    final Runnable r = new Runnable() {
        public void run() {
            //code to display dialog
        }
    }
    
    final View view = findViewById(R.id.XYZ);
    view.post(r);
    

    这将在 UI 线程上运行 Runnable

    【讨论】:

      【解决方案3】:

      好的,我可以看到两种方法。第一个很脏但很快: 您可以扩展 TimerTaskHandler 类。 YourTimerTask 将检查变量并将Message 发送到YourHandlerYourHandler 应该覆盖 handleMessage 并显示一个对话框。

      第二个可能有点矫枉过正,但仍然如此。 Android 是基于事件的。这意味着该系统让您有机会创建自己的事件并进行处理。因此,您可以启动一个Service,它将检查您的变量并发送一个Broadcast(可以是本地的)。在您的活动中,您必须创建自己的BroadcastReceiver 并注册它。此接收器将处理一条消息。

      【讨论】:

        猜你喜欢
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        相关资源
        最近更新 更多