如何将Runnable对象传递给Handler?

时间:2011-07-24 04:02:12

标签: android multithreading runnable handlers

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

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对象执行此操作的示例。有人有例子吗?

2 个答案:

答案 0 :(得分:4)

这样的事情:

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 
            } 
          } 
        }); 

答案 1 :(得分:2)

根据Handler的Android文档:

  

public final boolean post(Runnable r)

     

从以下版本开始:API Level 1导致Runnable r被添加到消息中   队列。 runnable将在此处理程序所在的线程上运行   连接。参数

     

r - 将执行的Runnable。返回

     

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