Java 主UI线程上的Android Runnable和handler

Java 主UI线程上的Android Runnable和handler,java,android,thread-safety,runnable,Java,Android,Thread Safety,Runnable,关于Java Andriod处理程序: handler.post(new Runnable(){ public void run() { // do stuff } }); 据我所知,这将在处理程序实例化的任何线程上运行。假设在Android中,我在主线程上实例化了处理程序,那么我的问题是runnable的意义是什么?如果将任务添加到主UI线程的消息传递队列中,为什么不跳过runnable并创建一个方法,因为您的任务已经在主线程上了。我见过程序员这样做,我想知道

关于Java Andriod处理程序:

handler.post(new Runnable(){
    public void run() {
        // do stuff
    }
});
据我所知,这将在处理程序实例化的任何线程上运行。假设在Android中,我在主线程上实例化了处理程序,那么我的问题是runnable的意义是什么?如果将任务添加到主UI线程的消息传递队列中,为什么不跳过runnable并创建一个方法,因为您的任务已经在主线程上了。我见过程序员这样做,我想知道为什么


我知道我们可以做
threadgenthread=newthread(newmyrunnable())但我想知道主线程上是否有Runnable的值。

我建议使用异步任务而不是处理程序,因为它们更容易理解,而且代码更干净。我知道我偏离了原来的问题,但这只是一个建议。如果您想了解更多有关AsyncTask的信息,请访问下面的链接


有时您希望运行某些代码,但不希望立即运行,而是希望延迟运行。在我的经验中,最常见的用法之一是当您处于布局阶段,并且希望在布局阶段完成后将要发生的事情“排队”时。为此,您只需将Runnable发布到UI线程的消息队列中,它就会被放在消息队列的末尾……这正是您想要的位置

另一个常见的用例是,如果您想从onCreate中找出视图的大小。在onCreate中,尚未对视图进行测量,因此这不起作用:

Log.d(TAG, view.getWidth());
相反,您可以这样做:

view.post(new Runnable() {public void run() {Log.d(TAG, view.getWidth());}}) ;

handler.post可以从任何线程调用,即使它是在ui线程上实例化的。从资源和性能角度来看,使用handler.obtainMessage()和.sendMessage比每次动态创建新的runnable要好得多。