【问题标题】:How do I pass Runnable objects to a Handler?如何将 Runnable 对象传递给 Handler?
【发布时间】:2011-07-24 04:02:11
【问题描述】:

我正在通过一本书学习,它给了我这个例子:

Handler handler=new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
        bar.incrementProgressBy(5); 
    } 
}; 

Thread background=new Thread(new Runnable() { 
    public void run() { 
        try { 
            for (int i=0;i<20 && isRunning.get();i++) { 
                Thread.sleep(500); 
                handler.sendMessage(handler.obtainMessage()); 
            } 
        } catch (Throwable t) { 
            // just end the background thread 
        } 
    } 
}); 

效果很好。但是,在书的后面,它说:

如果你不想对 Message 对象大惊小怪,你也可以通过 Runnable 对象到 Handler,它将运行那些 Runnable 活动 UI 线程上的对象。 ...您可以使用相同的方法 在任何视图(即任何小部件或容器)上。这稍微简化了 您的代码,因为您可以跳过 Handler 对象。

但是没有给出如何通过Runnable 对象执行此操作的示例。有人有例子吗?

【问题讨论】:

    标签: android multithreading runnable handlers


    【解决方案1】:

    类似这样的:

    Handler h = new Handler();
    

    Thread background=new Thread(new Runnable() { 
              public void run() { 
                try { 
                  for (int i=0;i<20 && isRunning.get();i++) { 
                    Thread.sleep(500); 
                    handler.post(new Runnable() {
                      public void run() {
                        bar.incrementProgressBy(5);
                      }
                    });
                  } 
                } 
                catch (Throwable t) { 
                  // just end the background thread 
                } 
              } 
            }); 
    

    【讨论】:

    • 感谢您的示例,已选择您的答案
    • 您现在有两个可运行文件。因此,您将有两个 run() 方法。我们对此无能为力...(但一些代码结构可以使它看起来更好一些。)
    • 对我来说仍然看起来有点奇怪 :) 作为一个习惯了这个的人(即,不是像我这样的菜鸟)......这是 Android 开发人员的流行格式吗?你在你的代码中经常使用这样的东西吗?
    • 经常使用嵌套类。 Runnable 特别是。我认为它更特定于 Java(尤其是 UI)而不是 Android。
    • 酷,感谢您的示例并花时间回答我的问题。干杯!
    【解决方案2】:

    根据Handler 的 Android 文档:

    public final boolean post (Runnable r)

    Since: API Level 1 导致 Runnable r 被添加到消息中 队列。可运行对象将在此处理程序所在的线程上运行 随附的。参数

    r -- 将被执行的 Runnable。返回

    如果 Runnable 已成功放入消息中,则返回 true 队列。失败返回false,通常是因为looper处理 消息队列正在退出。

    【讨论】:

    • 通过 google 或 docs 搜索查找定义非常容易。但是对于像我这样的菜鸟来说,这些定义可能是解释弦理论或火箭科学,这就是为什么我要问是否有人可以发布一个例子吗?看到代码再匹配定义就更容易理解了。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 2011-12-07
    • 2011-01-18
    • 2011-06-12
    • 2011-12-28
    • 2013-07-13
    • 2023-03-06
    • 2012-01-30
    相关资源
    最近更新 更多